Conditional and Looping Constructs
**********************************

This chapter documents PSPP commands used for conditional execution, looping, and flow of control.

BREAK
=====

     BREAK.

BREAK terminates execution of the innermost currently executing LOOP construct.

BREAK is allowed only inside LOOP...END LOOP. See LOOP, for more details.

DO IF
=====

     DO IF condition.
             ...
     [ELSE IF condition.
             ...
     ]...
     [ELSE.
             ...]
     END IF.

DO IF allows one of several sets of transformations to be executed, depending on user-specified conditions.

If the specified boolean expression evaluates as true, then the block of code following DO IF is executed.  If it evaluates as missing, then none of the code blocks is executed.  If it is false, then the boolean expression on the first ELSE IF, if present, is tested in turn, with the same rules applied.  If all expressions evaluate to false, then the ELSE code block is executed, if it is present.

When DO IF or ELSE IF is specified following TEMPORARY (see TEMPORARY), the LAG function may not be used (see LAG).

DO REPEAT
=========

     DO REPEAT repvar_name=expansion....
             ...
     END REPEAT [PRINT].

     expansion takes one of the following forms:
             var_list
             num_or_range...
             'string'...

     num_or_range takes one of the following forms:
             number
             num1 TO num2

DO REPEAT repeats a block of code, textually substituting different variables, numbers, or strings into the block with each repetition.

Specify a repeat variable name followed by an equals sign (=) and the list of replacements.  Replacements can be a list of variables (which may be existing variables or new variables or a combination thereof), of numbers, or of strings.  When new variable names are specified, DO REPEAT creates them as numeric variables.  When numbers are specified, runs of integers may be indicated with TO notation, for instance 1 TO 5 and 1 2 3 4 5 would be equivalent.  There is no equivalent notation for string values.

Multiple repeat variables can be specified.  When this is done, each variable must have the same number of replacements.

The code within DO REPEAT is repeated as many times as there are replacements for each variable.  The first time, the first value for each repeat variable is substituted; the second time, the second value for each repeat variable is substituted; and so on.

Repeat variable substitutions work like macros.  They take place anywhere in a line that the repeat variable name occurs as a token, including command and subcommand names.  For this reason it is not a good idea to select words commonly used in command and subcommand names as repeat variable identifiers.

If PRINT is specified on END REPEAT, the commands after substitutions are made are printed to the listing file, prefixed by a plus sign (+).

LOOP
====

     LOOP [index_var=start TO end [BY incr]] [IF condition].
             ...
     END LOOP [IF condition].

LOOP iterates a group of commands.  A number of termination options are offered.

Specify index_var to make that variable count from one value to another by a particular increment.  index_var must be a pre-existing numeric variable.  start, end, and incr are numeric expressions (see Expressions.)

During the first iteration, index_var is set to the value of start. During each successive iteration, index_var is increased by the value of incr.  If end > start, then the loop terminates when index_var > end; otherwise it terminates when index_var < end.  If incr is not specified then it defaults to +1 or -1 as appropriate.

If end > start and incr < 0, or if end < start and incr > 0, then the loop is never executed.  index_var is nevertheless set to the value of start.

Modifying index_var within the loop is allowed, but it has no effect on the value of index_var in the next iteration.

Specify a boolean expression for the condition on LOOP to cause the loop to be executed only if the condition is true.  If the condition is false or missing before the loop contents are executed the first time, the loop contents are not executed at all.

If index and condition clauses are both present on LOOP, the index clause is always evaluated first.

Specify a boolean expression for the condition on END LOOP to cause the loop to terminate if the condition is not true after the enclosed code block is executed.  The condition is evaluated at the end of the loop, not at the beginning.

If the index clause and both condition clauses are not present, then the loop is executed MXLOOPS (see SET) times.

BREAK also terminates LOOP execution (see BREAK).

Loop index variables are by default reset to system-missing from one case to another, not left, unless a scratch variable is used as index. When loops are nested, this is usually undesired behavior, which can be corrected with LEAVE (see LEAVE) or by using a scratch variable as the loop index.

When LOOP or END LOOP is specified following TEMPORARY (see TEMPORARY), the LAG function may not be used (see LAG).