Steven White — 25-Oct-2016/12:34:34-7:00
I do not yet speak the REBOL as she should be spoken. I am wondering about the 'vernacular' way to express a condition, where I have some code (for example) and I want to find out if it is (for example) a valid value of A or B or C or D.
In COBOL I can say:
IF CODE = 'A' OR 'B' OR 'C' OR 'D'
In SQL I can say:
CODE in ('A', 'B', 'C', 'D')
In REBOL, is there a better way than this (which does work just fine):
either (equal? CODE 'A') or
(equal? CODE 'B') or
(equal? CODE 'C') or
(equal? CODE 'D') [
print 'valid'
] [
print 'invalid'
Thank you.
Ennis — 25-Oct-2016/13:01:30-7:00
One way:
print either find ["A" "B" "C" "D"] CODE ["Valid"]["Invalid"]
iArnold — 25-Oct-2016/13:44:59-7:00
In Rebol the 'ALL and 'ANY functions replace the AND and OR in other languages:
print either any [code = "A" code = "B"
code = "C" code = "D"][
"valid"
][
"invalid"
]
Although Ennis' example is a very nice one, it is specific for string! (series!) type comparison.
Chris — 25-Oct-2016/20:39:34-7:00
iArnold: I wouldn't say that's entirely the case—
code: 1.7
either find [1 foo@bar 1.7 word] code ["valid"]["invalid"]
There is also SWITCH:
switch/default code [
"A" "B" "C" "D" ["valid"]
]["invalid"]
iArnold — 31-Oct-2016/16:41:51-7:00
Chris, you are correct.
But when using Red there is another catch with a multi selection in a switch. It is (used to be?) not supported when compiled and can lead to unexpected results.
Time Series Lord — 2-Nov-2016/18:39:15-7:00
You asked:
"I want to find out if some code is a valid value of A or B or C or D."
Rebol deals with data, specifically recognized data that can be loaded into REBOL and "assigned" a datatype!. The REBOL exec evaluates to produce fully reduced.
;; assuming
code: 'a
a: 'a
b: 'b
c: 'c
d: 'd
;; like COBOL
>> if (code = a) or (code = b) or (code = c) or (code = d) [print "yes"]
yes
;; REBOL
>> if any [equal? code a equal? Code b equal? Code c equal? Code d][print "yes"]
yes
;; Ennis' REBOL way
>> if found? find [a b c d] CODE [print "yes"]
yes
;; Pattern-based Decision-Expression
>> decisions: [
[ ['a | 'b | 'c | 'd] (print "yes")
[ ]
== [
['a | 'b | 'c | 'd] (print "yes")
]
>> parse to-block code decisions
yes
== true
>> code: 'z
== z
>> parse to-block code decisions
== false
ALSO ...
#"A" for char!
"A" for string!
You cannot do 'A' in REBOL. 'A' means this:
>> 'A'
== A'
It's a literal capital A with a tick.
Chris — 3-Nov-2016/18:24:41-7:00
Arnold--did not know that. SWITCH has always been a strange beast.