Applied some remarks from the PR reviewers :) and added more prose

This commit is contained in:
Suzanne Soy 2021-06-06 03:06:18 +01:00
parent dc8a63c351
commit 7170b127fb

View File

@ -59,9 +59,10 @@ value. The same form also handles splicing syntax classes. Syntax
classes with the @racket[#:no-delimit-cut] option cannot be reified.
}
@deftogether[(
@deftogether[[
@defproc[(reified-syntax-class? [x any/c]) boolean?]
@defproc[(reified-splicing-syntax-class? [x any/c]) boolean?])]{
@defproc[(reified-splicing-syntax-class? [x any/c]) boolean?]
]]{
Returns @racket[#t] if @racket[x] is a reified (normal) syntax class
or a reified splicing syntax class, respectively.
@ -355,17 +356,18 @@ invalid binding list.
one of:
@itemlist[
@item{an identifier bound to a run-time metafunction}
@item{an identifier bound to a run-time procedure implementing the
metafunction}
@item{the index of a field containing such an an identifier}
@item{a procedure that takes an instance of the structure and produces
such an identifier}]
The identifier's run-time metafunction should accept a syntax object
representing its use, and produce a new syntax object as a result.
The metafunction's implementation should accept a syntax object representing
its use, and produce a new syntax object as a result.
When an identifier is bound as syntax to a structure instance with this
property, it is treated as a template metafunction as if the identifier had
been declared with define-template-metafunction.
been declared with @racket[define-template-metafunction].
@examples[#:eval the-eval
(define (my-metafunction-proc stx)
@ -379,10 +381,31 @@ invalid binding list.
(define-syntax mf (mf-struct #'my-metafunction-proc))
(template (mf 3))
#'(mf 3)
(with-syntax ([(x ...) #'(1 2 3)])
(template ((mf x) ...)))]
#'((mf x) ...))]
In the example below, a @racketid[macro] defined as a phase 0 syntax
transformer refers to a phase 1 @racketid[macro-implementation]. In other
words, the implementation is a phase 1 expression, which runs at compile-time
with respect to the phase 0 code. Such a macro can make use of template
metafunctions inside its uses of @racket[#'…]. These metafunctions will be
implemented by phase 1 functions, i.e. they run at compile-time with respect to
the phase 0 code, and run at the same phase as the macro's code. The
@racketid[metafunction-identifier] is bound as phase 1 syntax transformers
which contain, via @racket[prop:template-metafunction], the name of the phase 1
function implementing the metafunction.
@examples[#:eval the-eval
(require (for-syntax racket/base))
(require (for-meta 2 racket/base))
(begin-for-syntax
(define (macro-implementation stx)
#'(metafunction-identifier metafunction-arguments)))
(define-syntax macro macro-implementation)
]
@history[#:added "8.2"]}
@(close-eval the-eval)