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.
"and so on"
will be displayed as "no os dna"
. Continue
reading until a line of zero length is read. AnsSian Mountbatten 2012-01-19