Chapter 10

Macros

Extensible Grammar

There are three kinds of macros: definition macros, which extend the available set of definitions; statement macros, which extend the available set of statements; and function macros, which syntactically resemble function calls but are more flexible. Named value references and local declarations cannot be macro calls. Only statements, function calls, and definitions are extensible.

Definition Macros

A definition macro extends the definition-macro-call production of the Dylan phrase grammar to recognize additional constructs as valid definitions, by creating a new define-body-word that is recognized by the following grammar line:

definition-macro-call:
define modifiersopt define-body-word body-fragmentopt definition-tail

or by creating a new define-list-word that is recognized by the following grammar line:

definition-macro-call:
define modifiersopt define-list-word list-fragmentopt

This allows programmers to extend Dylan by defining new kinds of definitions. The syntax of the definition must be parseable by one of these two predefined grammar rules. The first handles body-style definitions like define class, define method, and define module, while the second handles list-style definitions like define constant. See Appendix A, BNF, for the details.

The new define-body-word or define-list-word becomes a partially reserved word in each module where the macro definition is visible. In particular a define-body-word or define-list-word cannot be used as a modifier in a definition. It can still be used as a variable-name.

Statement Macros

A statement macro extends the statement production of the Dylan phrase grammar to recognize additional constructs as valid statements by creating a new begin-word that is recognized by the following grammar line:

statement:

begin-word body-fragmentopt end-clause

The new begin-word becomes a reserved word in each module where the macro definition is visible. It can only be used at the beginning and end of this new statement.

Function Macros

A function macro extends the function-macro-call production of the Dylan phrase grammar to recognize additional constructs by creating a new function-word that is recognized by the following grammar line:

function-macro-call:

function-word ( body-fragmentopt )

In addition, a function macro can be invoked by any of the shorthand syntax constructs available for invoking functions. In this case, the arguments are always parsed expression fragments, as described on page 146.

The new function-word becomes a reserved word in each module where the macro definition is visible. It can only be used at the beginning of a macro call.