@SubSection
    @Tag { operators }
    @Title { Operators }
@Begin
@PP
It is evident from the example of Eqn that user-defined operators are
needed that mimic the primitive ones in taking objects as parameters
and returning objects as results.  For example, to define a superscript
operator so that
@ID @Code "2 sup n"
appears as {@Eq {2 sup @R n}}, the following operator definition may
be used:
@ID @OneRow @Code {
"def sup"
"    precedence 50"
"    associativity right"
"    left x"
"    right y"
"{"
"    @OneRow {  |  {-2p @Font y}  ^/0.5fk  x  }"
"}"
}
The @Code "sup" operator has precedence 50, is right associative, takes
two objects as parameters passed on the left and right, and returns the
object between braces as result.  This object has the structure
@ID @I +2p @Font {
| @ShowMarks @Code y / @ShowMarks @Code x
}
but with the first row mark hidden by the @Code "@OneRow" operator,
and @Code y two points smaller than it would otherwise have been.  The
length @Code "0.5f" specifies half the current font size;  Figure
{@NumberOf gapmodes} describes the @Code k gap mode.  In the Eq equation
formatting package [10] the equation as a whole is
set in italic font, and @Code 2 is an identifier whose body contains
a font change back to Roman.  The digits @Code 0 to @Code 9 are classed
as punctuation characters, permitting @Code 234 for example to be
interpreted as a sequence of three identifiers.
@PP
These definitions are easily implemented by a standard symbol table
and an operator precedence parser.  Algol block structure with the
usual scope rules was adopted as a matter of course.
@PP
Operators are limited to at most two parameters, left and
right, and the parameters cannot be given default values.  @I Named
parameters solve both problems:
@ID @OneRow @Code {
"def @Preface"
"    named @Tag {}"
"    named @Title { Preface }"
"    right @Body"
"{"
"    Bold @Font @Title"
"    //0.3v  @Body"
"}"
}
The default value appears just after the parameter's declaration,
between braces.  Invocations have a natural syntax:
@ID @OneRow @Code {
"@Preface"
"    @Title { About this book }"
"{"
"    Few observers would have supposed in 1984, that ..."
"}"
}
with the actual named parameters following directly after the
operator, before any right parameter.  In this example, @Code "@Tag"
will receive its default value, and a less expert user could safely
omit the @Code "@Title" parameter as well.
@PP
Lout permits named parameters to have parameters, a feature with
applications to bibliographic databases, running headers, and other
places where a format has to be supplied before content is
known.  One could go further and provide a complete lambda calculus,
with functions as first-class objects, provided care was taken not
to intimidate the non-expert user.
@End @SubSection
