Introduction
Control Structures are blocks of code in which the execution of APL statements follows certain rules and conditions. Control structures are implemented using a set of control words that all start with the colon symbol (:). Control Words are case-insensitive.
There are a number of different types of control structures defined by the control words, :If
, :While
, :Repeat
, :For
(with the supplementary control words :In
and :InEach
), :Select
, :With
, :Trap
, :Hold
and :Disposable
. Each one of these control words may occur only at the beginning of an APL statement and indicates the start of a particular type of control structure.
Within a control structure, certain other control words are used as qualifiers. These are :Else
, :ElseIf
, :AndIf
, :OrIf
, :Until
, :Case
and :CaseList
.
A third set of control words is used to identify the end of a particular control structure. These are :EndIf
, :EndWhile
, :EndRepeat
, :EndFor
, :EndSelect
, :EndWith
, :EndTrap
, :EndHold
and :EndDisposable
. Although formally distinct, these control words may all be abbreviated to :End
.
Finally, the :GoTo
, :Return
, :Leave
and :Continue
control words may be used to conditionally alter the flow of execution within a control structure.
Control words, including qualifiers such as :Else
and :ElseIf
, may occur only at the beginning of a line or expression in a diamond-separated statement. The only exceptions are :In
and :InEach
which must appear on the same line within a :For
expression.
Key to Notation
The following notation is used to describe Control Structures within this section:
aexp |
an expression returning an array, |
bexp |
an expression returning a single Boolean value (0 or 1), |
var |
loop variable used by :For control structure, |
code |
0 or more lines of APL code, including other (nested) control structures, |
andor |
either one or more :AndIf statements, or one or more :OrIf statements. For further details, see below.| .-----------------------. | | |<--------------. |<--------------. | | | | code | code | | | | | | | | | :AndIf bexp-----' :OrIf bexp------' | | |<----------------------' | |
Notes
Code preceding :OrIf
and :AndIf
Code that precedes a :OrIf
control statement, e.g. code placed between a :If
statement and a subsequent :OrIf
, will be executed only if the outer condition is false. If instead the outer condition is true, there is no need to execute the :OrIf
statement , so it and any preceding lines of code are skipped.
Code that precedes a :AndIf
control statement, e.g. code placed between a :If
statement and a subsequent :AndIf
, will only be executed if the outer condition is true. If instead the outer condition is false, there is no need to execute the :AndIf
statement , so it and any preceding lines of code are skipped.
The above behaviour may be examined using the Tracer.
A potential use for code before a :OrIf
or :AndIf
is to prepare for the conditional test. This preparatory work will only be done if required. For example:
:If x ⍝ if x is false, skip everything up to the :EndIf
y←..⍝ set up stuff for the condition on the next line
:AndIf y
do stuff
:EndIf
Warning
With the exception of a diamondised statement, a control statement that should not be followed by an expression will generate an error if an expression is supplied.
A line in a function consisting of a control statement followed by a ⋄
and subsequent expression(s) is not currently disallowed but may exhibit unexpected behaviour. In particular, the line will not honour ⎕STOP
and will not be metered by ⎕MONITOR
. This syntax is not recommended.