According to the Dyalog APL language reference
the test condition to the right of :If must return a single element Boolean value 1 (true) or 0 (false)
Is there any particular reason why the value is allowed to be an array rather than requiring it to be a scalar? Is it only for convenience? Do other other APL dialects which implements the If statement also allow non-scalar guards?
(A scalar is a 0-dimensional array.)
A few more details to expand on Jürgen's answer:
It is very common to have 1-element vectors where a scalar is actually appropriate. This is especially true in APLs that do not have the monadic ≢
(Tally) function (including Dyalog prior to version 14.0), prompting people to use ⍴
(Shape) instead. For the same reason, allowing a 1-element array (singleton) is widely allowed in many contexts where, strictly speaking, a scalar would be required. This is known as singleton extension. Here are some examples of constructs that give a 1-element vector when one would actually want a scalar:
42=⍴myList
1⍴myTable
1↓myPair
⍴⍴myArray
Indeed, it was traditionally quite awkward to get a scalar, and this leniency was therefore a very welcome convenience. Some APLs didn't (and still don't!) have ⍬
for the empty numeric vector, but ⍴
was lenient about types and allowed ''
so the shortest contruct was the unintuitive ''⍴expression
. Today we have ⊃
or ↑
as first (depending on dialect).
Before control structures were added to various APLs (some still don't have them!), the only flow control was →
(Branch) which was defined as "go to the first line number in the array on the right, if any; do nothing if empty", allowing various computational methods to select branching destination. For example:
→(0=⍴⍴myArray)/SCAL
⍝ code for non-scalar arrays
→ENDIF
SCAL:
⍝ code for scalars
ENDIF:
The new control structures had to allow easy conversion of existing code and support common patterns:
:If 0≠⍴⍴myArray
⍝ code for non-scalar arrays
:Else
⍝ code for scalars
:EndIf
I don't have access to APL+, but APLX also allows 1-element vectors — not other singletons. As far as I know, it is unique to Dyalog to also accept higher-rank singletons.