Mailing List Archive: 49091 messages
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search

[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: toto: 5x5 ; 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] zero-pair toto 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 ; etc. ; 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 ] show bx ] ] ; Alain.