TEACH BRACKETS A.Sloman Feb 82
=== BRACKETS IN POP11 ==================================================
POP11 makes use of several different kinds of brackets to indicate the
beginnings, and ends, and sometimes middles, of bits of program. For
instance here are some opening and closing brackets, arranged as matched
pairs:
( ) (see HELP * ROUNDBRA)
[ ] (see HELP * SQUAREBRA)
{ } (see HELP * SQUAREBRA)
If you are using a terminal with upper case only, some of these will not
print properly.
If you don't balance brackets properly, POP11 complains. E.g. Try typing
the following unmatched pair of brackets to POP11:
( ]
You'll get a mishap message: POP11 complains about a MISPLACED SYNTAX
WORD. Similarly if you give it a closing bracket without an opener, e.g.
) or
}
Try the following too:
[ }
{ ]
Here the opening brackets indicate that a structure is to be built, ie.
a list (indicated by "[") or a vector indicated by "{". If the wrong
sort of closing bracket is found you'll get a 'MISSING CLOSING BRACKET'
error.
Compare
[a list with {a vector} in it] =>
{a vector with [a list] in it } =>
The situation is further complicated by the fact that the list brackets
[ ..... ] can enclose words, including some of the other brackets, e.g.
"(" and ")". So the following will not give an error:
[ ) a list of seven items ( ] =>
Though this will:
( ] not legal POP11 [ ) =>
Try that.
If you want to have a list or vector bracket included in a list or
vector, you'll have to 'unquote' it with '% .... %' and then quote it
with "..", e.g.
[a bracket % "}" % and another % "[" % ]
which creates a list of six elements.
Besides the 'obvious' brackets, there are several unobvious ones. For
instance, the word "define" is a sort of opening bracket. That is, when
POP11 reads it in, it has definite expectations about what is coming
next, namely a procedure heading, terminated by a semi-colon. e.g.
define double(x) -> result;
But if you leave out the "(", you'll get a complaint. Try:
define double x)
This is not a case of unexpected closing bracket. Rather, POP11 expects
a list of 'input variables' to follow the procedure name, and if it
meets ")" without its opener, it gets confused. If everything is OK up
to the semi-colon, then POP11, expects the closing bracket of a
procedure definition, and if it first meets another closer, before its
opener, then there's trouble. E.g. try
define double(x);
]
Compare
define double(x);
enddefine;
define double(x);
endif
ENDIF is the final closing bracket for IF, just as ENDUNTIL is the
closing bracket for UNTIL, ENDREPEAT the closing bracket for REPEAT,
etc.
POP11 doesn't like to find 'ENDIF' when it's looking for 'ENDDEFINE'.
Similarly, it doesn't like to find ENDDEFINE when its looking for
something else. Try the following:
if enddefine
if )
The first 'closing bracket' expected by IF is 'THEN'. It doesn't like
finding a different closing bracket, or even a semi-colon before then
try:
if ;
if 3 > 2 ;
After IF (and several other 'openers', like WHILE and UNTIL), POP11
treats ";" as an unacceptable closing bracket. After THEN, things are
different. What do you think will be 'expected' in the following
mishaps:
if then )
if then enddefine
What about
if then else enddefine
if then elseif ;
Getting used to all these different cases where mishaps occur takes a
little time. If you have a program in a file and you try to load it the
mishap message will include a line number telling you how far the file
had been read in before the mishap occurred. If your mishap involves
unmatched brackets, the actual cause of the mishap could be a long way
further back in the file. Try putting the following in a file, making
sure you put in an exact copy:
define silly(x);
if islist(x) then
length(([this is a long and silly list of words])
endif
enddefine;
Note the unmatched "(".
When you load the file, you'll get a line number in the mishap. This
does not correspond to the actual line in which the extra '(' was
inserted, but to the last line read in before the mishap was detected.
The 'doing' line of the mishap message also helps you to see which
'opening brackets' had not yet met their final closing brackets, e.g.
'DEFINE', 'IF', and '('
The looping brackets 'UNTIL' and 'WHILE' are a bit like 'IF', in that
you have a middle bracket 'DO', like 'THEN', and a final closing bracket
e.g. 'ENDUNTIL'. At present the POP11 system accepts 'THEN' instead of
'DO', and 'ENDDO' instead of 'ENDUNTIL'. For more on POP11 syntax, see
TEACH * POPSUMMARY
UNLESS is much like IF, except that it does not permit ELSE or ELSEIF
clauses. Try:
unless x > 3 then
x=>
else
3 =>
endunless;
--- C.all/teach/brackets -----------------------------------------------
--- Copyright University of Sussex 1988. All rights reserved. ----------Author: A.Sloman Feb 82