Go to the first, previous, next, last section, table of contents.
-
A loop_statement includes a sequence_of_statements that is to be
executed repeatedly, zero or more times.
Syntax
-
loop_statement ::=
[loop_statement_identifier:]
[iteration_scheme] loop
sequence_of_statements
end loop [loop_identifier];
-
iteration_scheme ::= while condition
| for loop_parameter_specification
-
loop_parameter_specification ::=
defining_identifier in [reverse] discrete_subtype_definition
-
If a loop_statement has a loop_statement_identifier, then the identifier
shall be repeated after the end loop; otherwise, there shall not be an
identifier after the end loop.
Static Semantics
-
A loop_parameter_specification declares a loop parameter, which is an
object whose subtype is that defined by the discrete_subtype_definition.
Dynamic Semantics
-
For the execution of a loop_statement, the sequence_of_statements is
executed repeatedly, zero or more times, until the loop_statement is
complete. The loop_statement is complete when a transfer of control
occurs that transfers control out of the loop, or, in the case of an
iteration_scheme, as specified below.
-
For the execution of a loop_statement with a while iteration_scheme, the
condition is evaluated before each execution of the
sequence_of_statements; if the value of the condition is True, the
sequence_of_statements is executed; if False, the execution of the
loop_statement is complete.
-
For the execution of a loop_statement with a for iteration_scheme, the
loop_parameter_specification is first elaborated. This elaboration
creates the loop parameter and elaborates the
discrete_subtype_definition. If the discrete_subtype_definition defines
a subtype with a null range, the execution of the loop_statement is
complete. Otherwise, the sequence_of_statements is executed once for
each value of the discrete subtype defined by the
discrete_subtype_definition (or until the loop is left as a consequence
of a transfer of control). Prior to each such iteration, the
corresponding value of the discrete subtype is assigned to the loop
parameter. These values are assigned in increasing order unless the
reserved word reverse is present, in which case the values are assigned
in decreasing order.
NOTES
-
(6) A loop parameter is a constant; it cannot be updated within the
sequence_of_statements of the loop, See section 3.3 Objects and Named Numbers.
-
(7) An object_declaration should not be given for a loop parameter,
since the loop parameter is automatically declared by the
loop_parameter_specification. The scope of a loop parameter extends from
the loop_parameter_specification to the end of the loop_statement, and
the visibility rules are such that a loop parameter is only visible
within the sequence_of_statements of the loop.
-
(8) The discrete_subtype_definition of a for loop is elaborated just
once. Use of the reserved word reverse does not alter the discrete
subtype defined, so that the following iteration_schemes are not
equivalent; the first has a null range.
-
for J in reverse 1 .. 0
for J in 0 .. 1
Examples
-
Example of a loop statement without an iteration scheme:
-
loop
Get(Current_Character);
exit when Current_Character = '*';
end loop;
-
Example of a loop statement with a while iteration scheme:
-
while Bid(N).Price < Cut_Off.Price loop
Record_Bid(Bid(N).Price);
N := N + 1;
end loop;
-
Example of a loop statement with a for iteration scheme:
-
for J in Buffer'Range loop -- works even with a null range
if Buffer(J) /= Space then
Put(Buffer(J));
end if;
end loop;
-
Example of a loop statement with a name:
-
Summation:
while Next /= Head loop -- See section 3.10.1 Incomplete Type Declarations
Sum := Sum + Next.Value;
Next := Next.Succ;
end loop Summation;
Go to the first, previous, next, last section, table of contents.