Subsections

Reference modes in transput

Wherever previously we have used a value of mode INT with print, we can safely use a name with mode REF INT, and similarly with all the other modes (such as [,]REAL). This is because the parameters for print (the identifiers or denotations used for print) are in a firm context and so can be dereferenced before being used.

In the preamble to this chapter, print's counterpart read was mentioned. It is now time to examine read more closely. Generally speaking, values displayed with print can be input with read. The main differences are that firstly, the parameters for read must be names. For example, we may write

   REF REAL r = LOC REAL;
   read(r)

and the program will skip spaces, tabs and end-of-line and new-page characters until it meets an optional sign followed by optional spaces and at least one digit, when it will expect to read a number. If an integer is present, it will be read, converted to the internal representation of an integer and then widened to a real.

Likewise, read may be used to read integers. The plus and minus signs (+ and -) can precede integers and reals. Absence of a sign is taken to mean that the number is positive. Any non-digit will terminate the reading of an integer except for a possible sign at the start. Reals can contain e as in 3.41e5. It is best to ensure that each number is preceded by a sign so that the reading of any preceding number will be terminated by that sign.

For a name of mode REF CHAR, a single character will be read, newline or newpage being called if necessary. In fact, tabs and any other control characters (whose absolute value is less than ABS blank) will also be skipped.

If read is used to read a []CHAR with fixed bounds as in

   REF[]CHAR sf = LOC[36]CHAR;
   read(sf)

then the number of characters specified by the bounds will be read, newline and newpage being called as needed. You can call newline and newpage explicitly to ensure that the next value to be input will start at the beginning of the next line or page.

Just like print, read can take more than one parameter by enclosing them in a row-display.

You should note that the end of a line or page will not terminate the reading of a number. So if you want to read a number from the keyboard, you should follow the number with a non-digit before pressing “Enter”. In this case, you don't have to read a newline as well, but the “Enter” generates a newline and that newline will be pending in the input.6.7

The only flexible name for which read can be used is REF STRING. When reading values for REF STRING, the reading pointer will not go past the end of the current line.6.8 If the reading position is already at the end of the line, the row will have no elements. When reading a STRING, newline must be called explicitly for transput to continue. The characters read are assigned to the name.


Exercises

5.13
Write a program to read two real numbers and then print their sum and product. Ans[*]
5.14
Write a program which will input text line by line (the lines being of different length) and which will then write out each line with the characters reversed. For example, the line "and so on" will be displayed as "no os dna". Continue reading until a line of zero length is read. Ans[*]


Sian Mountbatten 2012-01-19