Subsections

Loops revisited

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

Exercises

5.17
Write a program which will read integers until zero is encountered. The program should print the sums of the negative and positive integers. Ans[*]
5.18
Write a program which will read lines from the keyboard and then compute a unique code for each line as follows: if "did" is read, compute the value of
   ABS"d" + ABS"i"*2 + ABS"d"*3
Display 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