concatenated together using . (period) as the concatenation operator.

A string constant consists of any combination of characters within quotes except that quote itself is represented by two quotes.

e.g. name . 'has not been declared'

A contextual string resolution is provided:

e.g. given string (25) p, q, r
    p .→ q.(S).r

The string expression S is evaluated and located within p. The portion of p before the first occurrence of S is transferred to q, and the portion after S is transferred to r. An error condition occurs if S cannot be located within p. (See also conditional instructions.)

Assignments Assignments take the form

v = E

where v denotes any variable and E an expression. If v is an integer variable, then E must evaluate to an integer expression (henceforth denoted by I). No implicit rounding takes place; if required, it must be explicitly requested using the built-in function provided. If v denotes a string variable, E must be a string expression (denoted by S). In the case of assignments to strings or to byte and short integers, a check is made that no truncation takes place on assignment. An alternative form of assignment

v ← E

suppresses the check although any resulting truncation is naturally machine dependent.

Conditional instructions These take the form:

{ if } [condition] then [unconditional instrn]
{ unless }                else [unconditional instrn]

where the else clause may be omitted. A simple condition has the form:

<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>E</mi><mi>I</mi><mrow><mo fence="true">(</mo><mtable rowspacing="0.16em" columnalign="center" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">=</mo></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mo mathvariant="normal" lspace="0em" rspace="0em">≠</mo></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">&gt;</mo></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">&lt;</mo></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">≥</mo></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">≤</mo></mstyle></mtd></mtr></mtable><mo fence="true">)</mo></mrow><mi>E</mi><mn>2</mn></mrow><annotation encoding="application/x-tex">
EI \left( \begin{array}{c}
= \\
\neq \\
&gt; \\
&lt; \\
\geq \\
\leq
\end{array} \right) E2
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:7.2001em;vertical-align:-3.35em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.85em;"><span style="top:-5.8499em;"><span class="pstrut" style="height:9.2em;"></span><span style="width:0.875em;height:7.200em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.875em" height="7.200em" viewBox="0 0 875 7200"><path d="M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1

c-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349, -36,557 l0,3684c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210, 949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9 c0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5, -544.7,-112.5,-882c-2,-104,-3,-167,-3,-189 l0,-3692c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3, -210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z"/>==><E2

where EI and E2 are arithmetic, logical or string expressions. String resolution (see also above) can be used as a simple condition. The condition is regarded as true if the resolution can be completed.

e.g. if s .→ p.(q).r and z > 0 then ...

A compound condition consists of a number of simple conditions linked by and or or. There is no implied precedence between and and or, so that brackets are required to prevent ambiguity when both operators are present. Compound conditions are evaluated from left to right but only as far as is necessary for an overall verdict of true or false to be obtained.

e.g. x = 1 and y = 0 and z < 0
    (x > 1 and y = 0) or z = 0 .

Unconditional instructions include: assignments routine calls routine exits jumps

A compound statement can be constructed after a condition using start and finish (not begin and end) as brackets:

e.g. if x > 0 then start
    [list of statements]
    finish

Cycles The Atlas Autocode form of cycle is maintained:

cycle i = I1, I2, I3
    [list of statements]
    repeat

where i is an integer variable and I1, I2, I3 are integer expressions such that I2 ≠ 0 and (I3 - I1)/I2 is an integer ≥ 0. The integer expressions are evaluated prior to entering the cycle and remain unaltered. Two new forms of loop control have been recently introduced. Their definitions were greatly influenced by the writings of Dijkstra (1970). The new forms of cycle are: (a) while (condition) cycle [list of statements] repeat (b) until (condition) cycle [list of statements] repeat

Cycling continues while (until) the condition is true. Note that until implies testing the condition after the body has been traversed whereas while implies testing before a traverse is made. Thus the body of an until cycle is always executed at least once, whereas the body of a while cycle may not be executed at all. Cycles may be nested to any depth.

Labels and jumps The conditions and cycles already described are designed to allow system programs to be written without requiring jumps or labels. The following facilities are provided to give compatibility with Atlas Autocode. Labels take the form:

name;
N:
a(N):

where N denotes an integer constant. They can only be referenced from within the block in which they are set and not within any sub-blocks. Simple labels require no declarations but vector labels require a declaration of the form switch a(N1: N2). Jumps take the form:

→ name
→ N
→ a(I)

In the case of → a(I), I must be an integer expression and a run-time check is made that the corresponding label exists.

Structured data objects A limited form of structured object has been introduced to facilitate the manipulation of tables within the language. The structure of such an object is described by a non-executable record format statement of the form:

record format name ([declaration list])
e.g. record format f (integer i, j, k, string (5)s)

All declarations (including record) are accepted within a record format, but arrays must have constant bounds. Space is allocated by a record declaration which may reference any previously declared format: