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.