[REBOL] frustrating pairs...
From: alain:goye:free at: 7-May-2004 19:13
; pairs are not numbers, not series, not objects... too bad !
; If we set:
; all this (and more...) is wrong!:
set toto/x 3 ; toto/x is not a word
set 'toto/x 3 ; 'toto/x is not a word
in toto 'x ; toto is not an object
change toto 3 ; toto is not a series...
; So what ?
; Well, I am frustrated while trying to touch only x or y of a pair in a function. This
makes no problem:
zero-pair: func ['arg] [set arg 0x0]
toto ; OK
; But now if I want a function to set the pair's x value to 0, all this is wrong again:
zero-x: func [arg] [arg/x: 0] ; argument goes by reference
zero-x: func ['arg] [arg/x: 0] ; Cannot use path on word! value
zero-x: func ['arg] [set arg/x 0] ; toto/x is not a word
; Of course this for example works:
zero-x: func ['arg] [
p: get arg
set arg as-pair 0 p/y
; or in that special case:
zero-x: func ['arg] [set arg 0x1 * get arg]
; Is there a simpler way ?
; And what if I would like to pass an argument to specify whether to affect x or y in
the function ?
; this is short nice:
test-print: func [p [pair!] 'd [word!]] [print p/:d]
test-print toto x
; but this isn't that an ugly "usine à gaz" ("gas factory" in French) ? :
test-change: func [
'arg [word!] "the pair to affect"
'd [word!] "the direction to change: x or y"
val [integer!] "the value to set"
p: get arg
either d = 'x [
set arg as-pair val p/y
set arg as-pair p/x val
test-change toto x 10
; ...while one would like so much just to write something like :
arg/:d: val ; wrong of course...
; did I miss something please ?
; of course the above examples are useless, but here is the real one:
; a function to scroll a box's pane using a horizontal OR vertical slider:
scroll: func [bx "box" sf "slider" 'd "direction: x or y" /local tmp][
if none? bx/pane [exit]
if 0 < tmp: bx/pane/size/:d - bx/size/:d [
either d = 'x [ bx/pane/offset/x: - tmp * sf/data ] [ ; how to improve that ?
bx/pane/offset/y: - tmp * sf/data ]