rslt ← (f ##.and g) arg ⍝ Sequential test.
rslt ← (f ##.or g) arg
Sometimes, we must test conditions in sequence. For example, if we want to know
whether ⍵ is a scalar number, greater than zero, we need to check in order:
that ⍵ is a simple scalar
and that ⍵ is numeric
and that ⍵ is greater than zero.
In other words:
0=≡⍵ ⍝ simple scalar
and ⍬≡0/⍵ ⍝ numeric
and 0<⍵ ⍝ greater than 0
Unfortunately, we can't code this test using APL's primitive function "∧" be-
cause it unconditionally evaluates both of its arguments (APL's primitive dyadic
functions are said to be "strict in both arguments").
gt0 ← { ⍝ DON'T TRY THIS!
(0=≡⍵) ∧ (⍬≡0/⍵) ∧ (0<⍵): 'YEP' ⋄ 'NOPE' ⍝ IT WON'T WORK!
}
... and, in general, changing the order of these tests won't help.
We have to resort to complex guards, along the lines of:
gt0 ← {
{
0≠≡⍵:0 ⍝ not a simple scalar
~⍬≡0/⍵:0 ⍝ not numeric
⍵>0 ⍝ > 0
}⍵:'YEP' ⋄ 'NOPE'
}
Phil Last's [and] and [or] operators encapsulate this sequential testing, allow-
ing us to use the simpler:
gt0 ← {
{0=≡⍵} and {⍬≡0/⍵} and (0∘<) ⍵: 'YEP' ⋄ 'NOPE' ⍝ sequential testing.
}
Similarly, using "or":
gt0 ← {
{0≠≡⍵} or {⍬≢0/⍵} or (<∘0) ⍵: 'NOPE' ⋄ 'YEP' ⍝ ditto, using "or".
}
(muse:
Bob Smith has suggested that adjacent guard expressions be interpreted as
"lazy and"s, so gt0 could be coded:
gt0 ← {
0=≡⍵: ⍬≡0/⍵: 0<⍵: 'YEP' ⋄ 'NOPE' ⍝ sequential guards
}
)
Technical note:
Notice that [and] and [or] share much of the semantics of the C-language's &&
and ||.
Examples:
gt0←{ {0=≡⍵} and {⍬≡0/⍵} and (0∘<) ⍵: 'YEP' ⋄ 'NOPE'}
gt0¨ 3 ¯1 '7' ('ding' 'bat')
YEP NOPE NOPE NOPE
See also: else cond
Back to: contents
Back to: Workspaces