Previous: scheme syntax primitive, Up: scheme syntax [Index]
Libraries and top–level programs can define and use new kinds of derived expressions and definitions called syntactic abstractions or macros. A syntactic abstraction is created by binding a keyword to a macro transformer or, simply, transformer.
The transformer determines how a use of the macro (called a macro use) is transcribed into a more primitive form.
Most macro uses have the form:
(?keyword ?datum …)
where ?keyword is an identifier that uniquely determines the kind of form. This identifier is called the syntactic keyword, or simply keyword. The number of ?datums and the syntax of each depends on the syntactic abstraction.
Macro uses can also take the form of improper lists, singleton
identifiers, or set!
forms, where the second subform of the
set!
is the keyword:
(?keyword ?datum … . ?datum) ?keyword (set! ?keyword ?datum)
The define-syntax
, let-syntax
and letrec-syntax
forms create bindings for keywords, associate them with macro
transformers, and control the scope within which they are visible.
The syntax-rules
and identifier-syntax
forms create
transformers via a pattern language. Moreover, the syntax-case
form allows creating transformers via arbitrary Scheme code.
Keywords occupy the same name space as variables. That is, within the same scope, an identifier can be bound as a variable or keyword, or neither, but not both, and local bindings of either kind may shadow other bindings of either kind.
Macros defined using syntax-rules
and identifier-syntax
are “hygienic” and “referentially transparent” and thus preserve
Scheme’s lexical scoping.
Macros defined using the syntax-case
facility are also hygienic
unless datum->syntax
is used.
Previous: scheme syntax primitive, Up: scheme syntax [Index]