The field-selectors of a structure
mode are used to “extract” the
individual fields of a structure. For example, given this declaration
for the structure s
:
STRUCT(INT i,CHAR c) s = (2,"e")
we can select the first field of s
using the
selection
i OF s
The mode of the selection is INT
and its value is
2
. Note that the construct
OF is not an operator. The second field of
s
can be selected using the selection
c OF s
whose mode is CHAR
with value "e"
. The
field-selectors cannot be used on their own: they can only be used in
a selection.
A selection can be used as an operand. Consider the formula
i OF s * ABS c OF s
In the structure method
, declared in the previous section, the
procedure in the structure can be selected by
p OF method
which has the mode PROC(REAL)REAL
. For a reason which will be
clarified in chapter 10, if you want to call this procedure, you must
enclose the selection in parentheses:
(p OF method)(0.5)
Remembering that the context of the actual-parameters of a procedure is strong, you could also write
(p OF method)(int OF method)
where int OF method
would be widened to a real number
and the whole expression would yield a value of mode
REAL
.
The two fields of the structure double
(also declared in the
previous section), can be selected by writing
c OF double s OF double
and their modes are CHAR
and STRUCT(INT
i,j)
respectively. Now the fields of the inner structure
s
of double
can be selected by writing
i OF s OF double j OF s OF double
and both selections have mode INT
.
Now consider the structure name sn
declared by
STRUCT(INT i,CHAR s) sn;
The mode of sn
is
REF STRUCT(INT i,CHAR s)
This means that the mode of the selection
i OF sn
is not INT
, but REF INT
, and the mode of
the selection
c OF sn
is REF CHAR
. That is, the modes of the fields of a
structure name are all preceded by REF
(they are all names). This is particularly important for recursively
defined structures (see chapter 11). Thus, instead of assigning a
complete structure using a structure-display, you
can assign values to individual fields. That is, the assignment
sn:=(3,"f")
is equivalent to the assignments
i OF sn := 3; c OF sn := "f"
except that the assignments to the individual fields are separated by the go-on symbol (the semicolon ;) and the two units in the structure-display are separated by a comma and so are elaborated collaterally.
Given the declaration and initial assignment
STRUCT(CHAR c,STRUCT(INT i,j)s)dn:=double
the selection
s OF dn
has the mode REF STRUCT(INT i,j)
, and so you could
assign directly to it:
s OF dn:=(-1,-2)
as well as to one of its fields:
j OF s OF dn:=0
STRUCT(STRUCT(CHAR a,INT b)c, PROC(STRUCT(CHAR a,INT b))INT p, INT d)st; STRUCT(CHAR a,INT b)stawhat is the mode of Ans
c OF st
a OF c OF st
a OF sta
(p OF st)(sta)
b OF c OF st * b OF sta
sta:=c OF st
p OF st
in the last question. Ans