A macro is created using a "define" statement:

define-statement "define" MACRONAME {...}
$r = 0.2in
linerad = 0.75*$r
linewid = 0.25

# Start and end blocks
box "define-statement" bold fit
line down 50% from last box.sw
START: dot rad 250% color black
X0: last.e
move right 3.2in
END: box wid 5% ht 25% fill black
X9: last.w

# The main rule
arrow from X0 right 2*linerad+arrowht
oval "\"define\"" fit
oval "MACRONAME" fit
oval "{...}" fit
line right to X9

A define statement consists of the keyword "define" followed by an identifier that is the name of the macro and then the body of the macro contained within (possibly nested) curly braces.

After a macro is defined, the body of the macro is substituted in place of any subsequent occurrence of the identifier that is the macro name. The macro name can occur anywhere. The substitution is performed by the lexical analyzer, before tokens are identified and sent into the parser. Note this distinction: The "define" statement used to create a new macro is recognized by the parser, but the expansion of the macro is subsequent text happens in the lexical analyzer.


The invocation of a macro can be followed immediately by a parenthesized list of parameters. The open-parenthesis must immediately follow the macro name with no intervening whitespace. Parameters are comma-separated. There can be at most 9 parameters.

When parameters are present, they are substituted in the macro body in place of "$1", "$2", ..., "$9" in the macro body. If "$N" (for N between 1 and 9) occurs in the macro body but there are fewer than N parameters, then the "$N" is omitted.

Nested Macros

Macros can be nested up to a maximum depth that is determined at compile-time. (The current limit is 10.)

Arguments to nested macros can be arbitrary text, or a single "$N" parameter, but not both.

Macros cannot be undefined or redefined

Once created, a macro cannot be redefined. If you attempt to redefine a macro by providing a second "define" statement with the same macro name, the macro name will be replaced by the previous macro body definition during lexical analysis, likely resulting in a syntax error.