[EMAIL PROTECTED] wrote:

> I had expected that the argument type check would barf on my little
> pathological case, but it didn't!!!!!

It doesn't for the simple reason that:

>> type? :b
== paren!
>> probe :b
(a: negate a)
== (a: negate a)
>> type? b
== integer!
>> probe b
-1
== -1

So you're actually passing an integer, not a paren, to IFS.

> so you can imagine my surprise to obtain these results!
[...]

You're still passing an integer, here. (You get "zero" because you
have written IFS as:

   ifs: func [[throw] cexp pblk zblk nblk /local cval] [ ...

notice PBLK ZBLK NBLK instead of PBLK NBLK ZBLK.)

> Well, it appears that   do   does NOT distribute over evaluation of its
> argument!!!!!

It does, don't worry. :-)

Anyway, let me partecipate with my own version:

>> sign: func [num [number!]] [either zero? num [0] [divide num abs num]]
>> sign 2
== 1
>> sign -2
== -1
>> sign 0 
== 0
>> ifs: func [ 
[    [throw]     
[    num [number!]
[    if-pos [block!]
[    if-zero [block!]
[    if-neg [block!]
[    ] [
[    do get pick [if-neg if-zero if-pos] add 2 sign num
[    ]
>> ifs -2 ["positive"] ["zero"] ["negative"]
== "negative"
>> ifs 0 ["positive"] ["zero"] ["negative"] 
== "zero"
>> ifs 2 ["positive"] ["zero"] ["negative"]
== "positive"

Seems to work as expected. With B also:

>> ifs b ["positive"] ["zero"] ["negative"]
== "positive"
>> ifs b ["positive"] ["zero"] ["negative"]
== "negative"
>> ifs b ["positive"] ["zero"] ["negative"]
== "positive"

Notice that:

>> ifs :b ["positive"] ["zero"] ["negative"]
** Script Error: ifs expected num argument of type: number.
** Where: ifs :b ["positive"] ["zero"] ["negative"]

Different,
   Gabriele.
-- 
Gabriele Santilli <[EMAIL PROTECTED]> - Amigan - REBOL programmer
Amiga Group Italia sez. L'Aquila -- http://www.amyresource.it/AGI/

Reply via email to