Previous: baselib definitions variables, Up: baselib definitions [Index]
The define-syntax form described in this section is a
?definition used to create keyword bindings and may appear
anywhere other definitions may appear.
Binds ?keyword to the value of ?expression, which must
evaluate, at macro–expansion time, to a transformer. Macro
transformers can be created using the syntax-rules and
identifier-syntax forms.
Keyword bindings established by define-syntax are visible
throughout the body in which they appear, except where shadowed by other
bindings, and nowhere else, just like variable bindings established by
define. All bindings established by a set of definitions,
whether keyword or variable definitions, are visible within the
definitions themselves.
Implementation responsibilities: The implementation should detect if the value of ?expression cannot possibly be a transformer.
Example:
(let ()
(define even?
(lambda (x)
(or (= x 0) (odd? (- x 1)))))
(define-syntax odd?
(syntax-rules ()
((odd? x) (not (even? x)))))
(even? 10))
⇒ #t
An implication of the left–to–right processing order is that one definition can affect whether a subsequent form is also a definition.
Example:
(let ()
(define-syntax bind-to-zero
(syntax-rules ()
((bind-to-zero id) (define id 0))))
(bind-to-zero x)
x)
⇒ 0
The behavior is unaffected by any binding for bind-to-zero that
might appear outside of the let expression.