racket/collects/scribblings/reference/stx-expand.scrbl
Eli Barzilay ac26fe7554 A ton of @scheme*' -> @racket*' and related updates.
Also, updates some of the mzlib files to point at `racket/*' libraries
rather than to `scheme/*' ones.
2011-06-25 04:08:47 -04:00

143 lines
4.9 KiB
Racket

#lang scribble/doc
@(require "mz.rkt")
@title{Expanding Top-Level Forms}
@defproc[(expand [top-level-form any/c]) syntax?]{
Expands all non-primitive syntax in @racket[top-level-form], and
returns a syntax object for the expanded form that contains only core
forms, matching the grammar specified by @secref["fully-expanded"].
Before @racket[top-level-form] is expanded, its lexical context is
enriched with @racket[namespace-syntax-introduce], just as for
@racket[eval]. Use @racket[syntax->datum] to convert the returned
syntax object into a printable datum.}
Here's an example of using @racket[expand] on a module:
@racketblock[
(parameterize ([current-namespace (make-base-namespace)])
(expand
(datum->syntax
#f
'(module foo scheme
(define a 3)
(+ a 4)))))]
Here's an example of using @racket[expand] on a non-top-level form:
@racketblock[
(define-namespace-anchor anchor)
(parameterize ([current-namespace
(namespace-anchor->namespace anchor)])
(expand
(datum->syntax
#f
'(delay (+ 1 2)))))]
@defproc[(expand-syntax [stx syntax?]) syntax?]{
Like @racket[(expand stx)], except that the argument must be a
@tech{syntax object}, and its lexical context is not enriched before
expansion.}
@defproc[(expand-once [top-level-form any/c]) syntax?]{
Partially expands @racket[top-level-form] and returns a syntax object
for the partially-expanded expression. Due to limitations in the
expansion mechanism, some context information may be lost. In
particular, calling @racket[expand-once] on the result may produce a
result that is different from expansion via @racket[expand].
Before @racket[top-level-form] is expanded, its lexical context is
enriched with @racket[namespace-syntax-introduce], as for
@racket[eval].}
@defproc[(expand-syntax-once [stx syntax?]) syntax?]{
Like @racket[(expand-once stx)], except that the argument
must be a @tech{syntax object}, and its lexical context is not
enriched before expansion.}
@defproc[(expand-to-top-form [top-level-form any/c]) syntax?]{
Partially expands @racket[top-level-form] to reveal the outermost
syntactic form. This partial expansion is mainly useful for detecting
top-level uses of @racket[begin]. Unlike the result of
@racket[expand-once], expanding the result of
@racket[expand-to-top-form] with @racket[expand] produces the same
result as using @racket[expand] on the original syntax.
Before @racket[stx-or-sexpr] is expanded, its lexical context is
enriched with @racket[namespace-syntax-introduce], as for
@racket[eval].}
@defproc[(expand-syntax-to-top-form [stx syntax?]) syntax?]{
Like @racket[(expand-to-top-form stx)], except that the argument must
be a @tech{syntax object}, and its lexical context is not enriched
before expansion.}
@;------------------------------------------------------------------------
@section[#:tag "modinfo"]{Information on Expanded Modules}
Information for an expanded @racket[module] declaration is stored in a
set of @tech{syntax properties} (see @secref["stxprops"]) attached
to the syntax object:
@itemize[
@item{@indexed-racket['module-direct-requires] --- a list of
@tech{module path index}es (or symbols) representing the modules
explicitly imported into the module.}
@item{@indexed-racket['module-direct-for-syntax-requires] --- a list
of @tech{module path index}es (or symbols) representing the modules
explicitly for-syntax imported into the module.}
@item{@indexed-racket['module-direct-for-template-requires] --- a
list of @tech{module path index}es (or symbols) representing the
modules explicitly for-template imported into the module.}
@item{@indexed-racket['module-variable-provides] --- a list of
provided items, where each item is one of the following:
@itemize[
@item{@racket[symbol] --- represents a locally defined variable that
is provided with its defined name.}
@item{@racket[(cons _provided-sym _defined-sym)] --- represents a
locally defined variable that is provided with renaming; the first
symbol is the exported name, and the second symbol is the defined
name.}
@item{@racket[(list* module-path-index _provided-sym _defined-sym)]
--- represents a re-exported and possibly re-named variable from the
specified module; @racket[module-path-index] is either a
@tech{module path index} or symbol (see @secref["modpathidx"]),
indicating the source module for the binding. The
@racket[_provided-sym] is the external name for the re-export, and
@racket[_defined-sym] is the originally defined name in the module
specified by @racket[module-path-index].}
]}
@item{@indexed-racket['module-syntax-provides] --- like
@racket['module-variable-provides], but for syntax exports instead of
variable exports.}
@item{@indexed-racket['module-indirect-provides] --- a list of symbols for
variables that are defined in the module but not exported; they may
be exported indirectly through macro expansions. Definitions of
macro-generated identifiers create uninterned symbols in this list.}
]