Next: Pattern language, Up: Macros [Index]
The let-syntax
and letrec-syntax
binding constructs are
analogous to let
and letrec
, but they bind syntactic
keywords to macro transformers instead of binding variables to locations
that contain values. Syntactic keywords can also be bound globally or
locally with define-syntax
; See Syntax definitions.
Syntax: ⟨Bindings⟩ has the form
((
⟨keyword⟩ ⟨transformer spec⟩)
…)
Each ⟨keyword⟩ is an identifier, each ⟨transformer spec⟩
is an instance of syntax-rules
, and ⟨body⟩ is a sequence
of zero or more definitions followed by one or more expressions. It is
an error for a ⟨keyword⟩ to appear more than once in the list of
keywords being bound.
Semantics: The ⟨body⟩ is expanded in the syntactic environment
obtained by extending the syntactic environment of the let-syntax
expression with macros whose keywords are the ⟨keyword⟩s, bound
to the specified transformers. Each binding of a ⟨keyword⟩ has
⟨body⟩ as its region.
(let-syntax ((given-that (syntax-rules () ((given-that test stmt1 stmt2 ...) (if test (begin stmt1 stmt2 ...)))))) (let ((if #t)) (given-that if (set! if 'now)) if)) ⇒ now (let ((x 'outer)) (let-syntax ((m (syntax-rules () ((m) x)))) (let ((x 'inner)) (m)))) ⇒ outer
Syntax: Same as for let-syntax
.
Semantics: The ⟨body⟩ is expanded in the syntactic
environment obtained by extending the syntactic environment of the
letrec-syntax
expression with macros whose keywords are the
⟨keyword⟩s, bound to the specified transformers. Each binding of a
⟨keyword⟩ has the ⟨transformer spec⟩s as well as the ⟨body⟩
within its region, so the transformers can transcribe expressions into
uses of the macros introduced by the letrec-syntax
expression.
(letrec-syntax ((my-or (syntax-rules () ((my-or) #f) ((my-or e) e) ((my-or e1 e2 ...) (let ((temp e1)) (if temp temp (my-or e2 ...))))))) (let ((x #f) (y 7) (temp 8) (let odd?) (if even?)) (my-or x (let temp) (if y) y))) ⇒ 7
Next: Pattern language, Up: Macros [Index]