Another fine response!

[EMAIL PROTECTED] wrote:
> 
> This is a bit shorter, but still not as nice as the Rebol way as
> used in System and View.
> [
> Rebol [
>     File: %Tally.r
>     ]
> 
> tally: make object! [
>     tot: 0
>     zero: does [tot: 0]
>     up: func [/by n [number!]] [print "up!" tot: tot + either by [n] [1]]
>     down: func [/by n [number!]] [print "down!" tot: tot - either by [n]
> [1]]
>     now?: does [tot]
>     ]
> 
> bunchanums: [3 1 35 8 4 5 52 42 19 13 32 43 81 2 6 34 46]
> 
> ; A better name for this function would be appreciated.
> mpc: func [Block [block!]] [
>     make path! compose Block
>     ]
> 

Not very inspired, but I'd suggest  compose-path  as the best I
can come up with.

>
> ; A better name for this function would be appreciated.
> dr: func [Block [block!]] [
>     do reduce Block
>     ]
> 

Well, inspired by  repend  I might suggest  do-re-me  but then I'd
have the entire von Trapp family (and Julie Andrews) accusing me of
theft of "intellectual property"!  ;-)

Seriously, we could take inspiration from LISP and call this
function  apply  as it allows one to apply a (dynamically
determined) function to a (dynamically determined) argument list.
Or perhaps  eval  would fit???

>
> use [diffs] [
>     diffs: make tally []
>     evens: make tally []
>     odds: make tally []
>     foreach num bunchanums [
>         dr [mpc [diffs (either even? num ['up] ['down]) by] num]
>         dr [mpc [(either even? num ['evens] ['odds]) up by] num]
>         ]
>     print ["diffs/now?" diffs/now?]
>     print ["evens/now?" evens/now?]
>     print ["odds/now?" odds/now?]
>     ]
> 
> ]
> >> do %Tally.r
[...tracing output snipped...]
> diffs/now? 26
> evens/now? 226
> odds/now? 200
> 

All told, I think the two functions above are quite nice!  They
certainly handle the diffs case well.  I'm a little less cheerful
about how they handle the evens/odds case however, in that they
require that I have a NAME for an object, in order to construct
a path to the needed object/method.

Gabriele's  do-in  allows me to get at a method of an object with
only the object itself (and the name of the method) in hand, not
requiring a name for the object.  This becomes more of an issue
if we generalize my dinky example to other ways we might have
worked with a collection of tally instances.  Given Gabriele's
do-in and my tally and data:

    >> do-in: func [obj [object!] code [block!]] [do bind/copy code in
obj 'self]

    >> tally: make object! [
    [    tot:  0
    [    zero: does [tot: 0]
    [    up:   func [/by n [number!]] [tot: tot + either by [n] [1]]
    [    down: func [/by n [number!]] [tot: tot - either by [n] [1]]
    [    now?: does [tot]
    [    ]

    >> bunchanums: [3 1 35 8 4 5 52 42 19 13 32 43 81 2 6 34 46]
    == [3 1 35 8 4 5 52 42 19 13 32 43 81 2 6 34 46]

...we can say...

   >> use [tallies] [
   [    tallies: copy []
   [    loop 3 [append tallies make tally []]
   [    foreach num bunchanums [
   [        do-in pick tallies (num // 3 + 1) [up/by num]
   [        ]
   [    foreach tally tallies [print tally/now?]
   [    ]
   132
   212
   82

...without needing to name the members of tallies.


At any rate, between you and Gabriele, we now have nicer solutions
to BOTH variations of my question!

Thanks!

>
> AllenK has a better grasp of the ideal Rebol way to do this. But
> he says it is difficult to explain. More about this later, or you
> could pester Allen.
> :-)
> 

Hey, Allen!  Are you there?

Please chime in before Andrew makes me pester you!  ;-)

-jn-

Reply via email to