If without a THEN
[1/12] from: sanghabum:aol at: 9-Aug-2001 14:41
Hi all,
Just purely out of curiosity, can anyone tell me why this badly-bracketed
code does anything other than give a message "Script Error: if expected
then-block argument of type: block"?
myblock: [1 2 3 4 5 6 7 8 9 10 11 12]
foreach xx myblock [
if xx = 9
remove find myblock xx
] ; for
print myblock
--Thanks,
--Colin
[2/12] from: ammoncooke:yah:oo at: 9-Aug-2001 13:00
ya,
the code should like something like this;
if xx = 9 [
remove find myblock xx
]
the if statement needs to know when the *then* block (the one that contains
what to do if the test statement returns true) & when it ends.
HTH
Ammon
[3/12] from: christian::ensel::gmx::de at: 9-Aug-2001 21:13
Hi Colin,
the answer is that your IF has got what it expected: a block - because the
REMOVE statement returns a block. Insert a PROBE before IF and you'll see ...
Cheers,
Christian
[4/12] from: sanghabum:aol at: 9-Aug-2001 15:30
[Ammoncooke--yahoo--com] writes:
> the code should like something like this;
>
> if xx = 9 [
> remove find myblock xx
> ]
>
Thanks Ammon,
I know what's wrong with the code. What sparked my suriousity was why it runs
at all--let alone the result it produces. I guess I'm just puzzled by the
wierdness when I ought to be working.
--Colin.
[5/12] from: ryanc:iesco-dms at: 9-Aug-2001 12:30
Your answer is that 'remove returns a block, so 'if gets the argument type it
needs. No reason for error. The contents of the block at the position
returned by remove are simply evaluated, in this case to effect other than
returning the last value in the block, 12.
--Ryan
[Sanghabum--aol--com] wrote:
> Hi all,
> Just purely out of curiosity, can anyone tell me why this badly-bracketed
<<quoted lines omitted: 12>>
> [rebol-request--rebol--com] with "unsubscribe" in the
> subject, without the quotes.
--
Ryan Cole
Programmer Analyst
www.iesco-dms.com
707-468-5400
[6/12] from: ammoncooke:yah:oo at: 9-Aug-2001 13:57
I recently was dealing with a lot of errors when I got confused as to the
structure of if...
thniking tha if needed two blocks I wrote several if statements like this:
if [test block] [then block]
after hours of confusion I return once again to the wonderful core.pdf...
after a short time searching I discovered my error & after correcting
everingthing ran beautifully! I unserstand the confusion.
Enjoy!!
Ammon
[7/12] from: ryanc:iesco-dms at: 9-Aug-2001 14:09
Looked weird to me too, it never occurred to me to use 'if that way.
>> something: true
== true
>> reaction: [print "HOLY COW!"]
>> if something reaction
HOLY COW!
>>
Ryan Cole wrote:
> Your answer is that 'remove returns a block, so 'if gets the argument type it
> needs. No reason for error. The contents of the block at the position
<<quoted lines omitted: 30>>
> [rebol-request--rebol--com] with "unsubscribe" in the
> subject, without the quotes.
--
Ryan Cole
Programmer Analyst
www.iesco-dms.com
707-468-5400
[8/12] from: sanghabum:aol at: 9-Aug-2001 17:29
Thanks for all the replies. My original typo has opened up a new world of
Rebol syntax for me.
I can now write code like:
if 1 = 1 load/all %myscript.r
rather than
if 1 = 1 [do %myscript.r]
I'm sure I'll think of a good use for this, other than using less of the
world's supply of pesky square brackets
--Colin
[9/12] from: jelinem1:nationwide at: 9-Aug-2001 16:50
By looking at the results of your original example, the unbracketted code
following the 'if condition gets evaluated with every execution of the 'if
word, whether or not the condition is true. Just something to be aware of.
- Michael
[Sanghabum--aol--com]
Sent by: [rebol-bounce--rebol--com]
08/09/01 04:29 PM
Please respond to rebol-list
T
To: [rebol-list--rebol--com]
cc:
bcc:
Subject: [REBOL] Re: If without a THEN
Thanks for all the replies. My original typo has opened up a new world of
Rebol syntax for me.
I can now write code like:
if 1 = 1 load/all %myscript.r
rather than
if 1 = 1 [do %myscript.r]
I'm sure I'll think of a good use for this, other than using less of the
world's supply of pesky square brackets
--Colin
[10/12] from: ammoncooke:ya:hoo at: 9-Aug-2001 15:58
Hey, that is kewl!!
Ammon
[11/12] from: joel:neely:fedex at: 9-Aug-2001 17:31
Hi, Ryan et al.,
Ryan Cole wrote:
> Looked weird to me too, it never occurred to me to use 'if
> that way.
<<quoted lines omitted: 4>>
> HOLY COW!
> >>
An equivalent concept has been common practice in FORTH for
at least 15-20 years as a way to refactor decision logic,
such as moving always-the-same decisions out of a loop.
As a trivial example, suppose we need to take a block of numbers
and calculate either the square of each number or the square root
of each number (where the decision is the same for all number in
a single evaluation of the function). We could write:
square-or-root: func [flag [logic!] b [block!] /local c] [
c: copy b
forall c [
either flag [
change c (first c) * first c
][
change c square-root first c
]
]
head c
]
print mold square-or-root true [1 4 9 16]
print mold square-or-root false [1 4 9 16]
which behaves as follows:
>> print mold square-or-root true [1 4 9 16]
[1 16 81 256]
>> print mold square-or-root false [1 4 9 16]
[1 2 3 4]
The politically-correct but trivial refactoring into
square-or-root: func [flag [logic!] b [block!] /local c] [
c: copy b
forall c [
change c either flag [
(first c) * first c
][
c square-root first c
]
]
head c
]
gives the same result, and still leaves the decision inside the
loop, to be made over and over the same way each time. However,
square-or-root: func [flag [logic!] b [block!] /local c work] [
c: copy b
work: either flag [
[change c(first c) * first c]
][
[change c square-root first c]
]
forall c work
head c
]
takes the decision outside the loop. Now the block in WORK is
pre-configured
to do The Right Thing based on the FLAG argument
that doesn't change during the evaluations of the loop.
HTH!
-jn-
This sentence contradicts itself -- no actually it doesn't.
-- Doug Hofstadter
joel<dot>neely<at>fedex<dot>com
[12/12] from: john:thousand-hills at: 9-Aug-2001 18:01
If has no then or else argument. It will either operate or return "false".
Try the EITHER function. EITHER argument [ DO IF TRUE ] [ DO IF FALSE ]
Example:
either d > 100 [ print d ] [ print d + 100 ]
john
else At 02:41 PM 8/9/2001 -0400, you wrote:
Notes
- Quoted lines have been omitted from some messages.
View the message alone to see the lines that have been omitted