[REBOL] Rebol/Core User's Guide Re:(4)
From: g:santilli:tiscalinet:it at: 12-Oct-2000 11:29
[joel--neely--fedex--com] 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 <[giesse--writeme--com]> - Amigan - REBOL programmer
Amiga Group Italia sez. L'Aquila -- http://www.amyresource.it/AGI/