Home   Archive   Permalink



Vernacular condition

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.


posted by:   Steven White     25-Oct-2016/12:34:34-7:00



One way:
    
print either find ["A" "B" "C" "D"] CODE ["Valid"]["Invalid"]

posted by:   Ennis     25-Oct-2016/13:01:30-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.

posted by:   iArnold     25-Oct-2016/13:44:59-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"]

posted by:   Chris     25-Oct-2016/20:39:34-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.


posted by:   iArnold     31-Oct-2016/16:41:51-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.
    


posted by:   Time Series Lord     2-Nov-2016/18:39:15-7:00



Arnold--did not know that. SWITCH has always been a strange beast.

posted by:   Chris     3-Nov-2016/18:24:41-7:00