In section 3.7, we introduced the
loop clause whose start, step and finish were specified by integer
denotations. Instead of an integer, a unit which yields a value of
mode INT
in a meek context can be
supplied. The principle coercions not available in a meek context are
rowing and widening. In practice, almost any unit yielding
INT
will do. In particular, a name with mode REF
INT
can be given.
There is an extra construct which is extremely useful for
controlling the execution of the
DO
... OD
loop. It is very common
to execute a loop while a particular condition holds. For example,
while integers are negative:
WHILE REF INT int=LOC INT; read(int); int < 0 DO print((ABS int,newline)) OD
In this example, no loop counter was needed and so the FOR
id
part was omitted. The phrase following the
WHILE must be an enquiry
clause yielding BOOL
. In this case, an
integer is read each time the loop is elaborated until a non-negative
integer is read. The range of any declarations in the enquiry clause
extends to the DO
... OD
loop.
It happens quite often that the WHILE
enquiry clause
performs all the actions which need repeating and nothing is required
in the DO
part. Since the loop clause must contain at
least one unit, SKIP can be used as in
FOR i FROM LWB a TO UPB a WHILE (sum+:=a[i]) <= max DO SKIP OD
The complete loop clause thus takes the form:
FOR id FROM from-unit BY by-unit TO to-unit WHILE boolean-enquiry-clause DO serial clause OD
"did"
is read, compute the value of
ABS"d" + ABS"i"*2 + ABS"d"*3Display the string and its corresponding number on the screen. Terminate the program when a zero-length line has been read (if the result exceeds max int, you will normally not get an error: just erroneous results--see section 13.3.13). Ans
Sian Mountbatten 2012-01-19