#### 16.4.7 The `LOOP`

and `BREAK`

Commands

`LOOP`

[*var*`=`

*first* `TO`

*last* [`BY`

*step*]] [`IF`

*expression*]`.`

…*matrix commands*…
`END LOOP`

[`IF`

*expression*]`.`

`BREAK`

`.`

The `LOOP`

command executes a nested group of matrix commands,
called the loop’s *body*, repeatedly. It has three optional
clauses that control how many times the loop body executes.
Regardless of these clauses, the global `MXLOOPS`

setting, which
defaults to 40, also limits the number of iterations of a loop. To
iterate more times, raise the maximum with `SET MXLOOPS`

outside
of the `MATRIX`

command (see SET MXLOOPS).

The optional index clause causes `var` to be assigned successive
values on each trip through the loop: first `first`, then
`first` + `step`, then `first` + 2 ×
`step`, and so on. The loop ends when `var` >
`last`, for positive `step`, or `var` <
`last`, for negative `step`. If `step` is not specified,
it defaults to 1. All the index clause expressions must evaluate to
scalars, and non-integers are rounded toward zero. If `step`
evaluates as zero (or rounds to zero), then the loop body never
executes.

The optional `IF`

on `LOOP`

is evaluated before each
iteration through the loop body. If its expression, which must
evaluate to a scalar, is zero or negative, then the loop terminates
without executing the loop body.

The optional `IF`

on `END LOOP`

is evaluated after each
iteration through the loop body. If its expression, which must
evaluate to a scalar, is zero or negative, then the loop terminates.

The following computes and prints *l(n)*, whose value is the
number of steps in the
Juggler sequence
for *n*, for *n* from 2 to 10 inclusive:

COMPUTE l = {}.
LOOP n = 2 TO 10.
COMPUTE a = n.
LOOP i = 1 TO 100.
DO IF MOD(a, 2) = 0.
COMPUTE a = TRUNC(a &** (1/2)).
ELSE.
COMPUTE a = TRUNC(a &** (3/2)).
END IF.
END LOOP IF a = 1.
COMPUTE l = {l; i}.
END LOOP.
PRINT l.