12.9 Expanding Top-Level Forms
Before top-level-form is expanded, its lexical context is enriched with namespace-syntax-introduce, just as for eval. Use syntax->datum to convert the returned syntax object into a printable datum.
Here’s an example of using expand on a module:
(parameterize ([current-namespace (make-base-namespace)]) (expand (datum->syntax #f '(module foo scheme (define a 3) (+ a 4)))))
Here’s an example of using expand on a non-top-level form:
(define-namespace-anchor anchor) (parameterize ([current-namespace (namespace-anchor->namespace anchor)]) (expand (datum->syntax #f '(delay (+ 1 2)))))
procedure
(expand-syntax stx) → syntax?
stx : syntax?
procedure
(expand-once top-level-form) → syntax?
top-level-form : any/c
Before top-level-form is expanded, its lexical context is enriched with namespace-syntax-introduce, as for eval.
procedure
(expand-syntax-once stx) → syntax?
stx : syntax?
procedure
(expand-to-top-form top-level-form) → syntax?
top-level-form : any/c
Before stx-or-sexpr is expanded, its lexical context is enriched with namespace-syntax-introduce, as for eval.
procedure
(expand-syntax-to-top-form stx) → syntax?
stx : syntax?
12.9.1 Information on Expanded Modules
Information for an expanded module declaration is stored in a set of syntax properties (see Syntax Object Properties) attached to the syntax object:
'module-body-context —
a syntax object whose lexical information corresponds to the inside of the module, so it includes the expansion’s outside-edge scope and its inside-edge scope; that is, the syntax object simulates an identifier that is present in the original module body and inaccessible to manipulation by any macro, so that its lexical information includes bindings for the module’s imports and definitions. Added in version 6.4.0.1 of package base.
'module-body-inside-context —
a syntax object whose lexical information corresponds to an identifier that starts with no lexical context and is moved into the macro, so that it includes only the expansions’s inside-edge scope. Added in version 6.4.0.1 of package base.
'module-body-context-simple? —
a boolean, where #t indicates that the bindings of the module’s body (as recorded in the lexical information of the value of the 'module-body-inside-context property) can be directly reconstructed from modules directly imported into the module, including imported for-syntax, for-meta, and for-template. Added in version 6.4.0.1 of package base.
Changed in version 7.0 of package base: Removed 'module-variable-provides, 'module-syntax-provides, 'module-indirect-provides, and 'module-indirect-for-meta-provides properties.