An identifier is a writable designator if it is declared as a variable,
is a VAR
or VALUE
parameter, is a local of a TYPECASE
or
TRY
-EXCEPT
statement, or is a WITH
local that is bound to a
writable designator. An identifier is a readonly designator if it is a
READONLY
parameter, a local of a FOR
statement, or a WITH
local bound to a non-designator or readonly designator.
The only operations that produce designators are dereferencing, subscripting,
selection, and SUBARRAY
. This section defines these operations and
specifies the conditions under which they produce designators. In unsafe
modules, LOOPHOLE
can also produce a designator.
r^
r
; this operation is called
dereferencing. The expression r^
is always a writable
designator. It is a static error if the type of r
is REFANY
,
ADDRESS
, NULL
, an object type, or an opaque type, and a
checked runtime error if r
is NIL
. The type of r^
is
the referent type of r
.
a[i]
(i + 1 - FIRST(a))
-th element of the array a
. The
expression a[i]
is a designator if a
is, and is writable if
a
is. The expression i
must be assignable to the index type
of a
. The type of a[i]
is the element type of a
.
An expression of the form a[i_1, ..., i_n]
is shorthand for
a[i_1]...[i_n]
. If a
is a reference to an array, then
a[i]
is shorthand for a^[i]
.
r.f
, o.f
, I.x
, T.m
, E.id
r
denotes a record, r.f
denotes its f
field. In
this case r.f
is a designator if r
is, and is writable if
r
is. The type of r.f
is the declared type of the field.
If r
is a reference to a record, then r.f
is shorthand for
r^.f
.
If o
denotes an object and f
names a data field specified in
the type of o
, then o.f
denotes that data field of o
.
In this case o.f
is a writable designator whose type is the declared
type of the field.
If I
denotes an imported interface, then I.x
denotes the
entity named x
in the interface I
. In this case I.x
is
a designator if x
is declared as a variable; such a designator is
always writable.
If T
is an object type and m
is the name of one of T
's
methods, then T.m
denotes the m method of type T
. In this
case T.m
is not a designator. Its type is the procedure type whose
first argument has mode VALUE
and type T
, and whose remaining
arguments are determined by the method declaration for m
in T
.
The name of the first argument is unspecified; thus in calls to T.m
,
this argument must be given positionally, not by keyword. T.m
is a
procedure constant.
If E
is an enumerated type, then E.id
denotes its value named
id
. In this case E.id
is not a designator. The type of
E.id
is E
.
SUBARRAY(a: Array; from, for: CARDINAL): ARRAY OF ElemType(a)
SUBARRAY
produces a subarray of a
. It does not copy the
array; it is a designator if a
is, and is writable if a
is.
If a
is a multi-dimensional array, SUBARRAY
applies only to
the top-level array.
The operation returns the subarray that skips the first from
elements
of a
and contains the next for
elements. Note that if
from
is zero, the subarray is a prefix of a
, whether the type
of a
is zero-based or not. It is a checked runtime error if
from+for
exceeds NUMBER(a)
.
Implementations may restrict or prohibit the SUBARRAY
operation for
arrays with packed element types.
m3-support@elego.de