12.11 Syntax Utilities
12.11.1 Creating formatted identifiers
Like
format, but produces an identifier using
lctx
for the lexical context,
src for the source location, and
props for the properties. An argument supplied with
#:cert is ignored. (See
datum->syntax.)
The format string must use only ~a placeholders. Identifiers
in the argument list are automatically converted to symbols.
Examples:
|
|
> (make-pred pair) |
#<procedure:pair?> |
> (make-pred none-such) |
none-such?: undefined; |
cannot reference undefined identifier |
|
|
> (better-make-pred none-such) |
none-such?: undefined; |
cannot reference undefined identifier |
(Scribble doesn’t show it, but the DrRacket pinpoints the location of
the second error but not of the first.)
Like
format, but produces a symbol. The format string must
use only
~a placeholders. Identifiers in the argument list
are automatically converted to symbols.
Example:
12.11.2 Pattern variables
Definition form of
with-syntax. That is, it matches the
syntax object result of
expr against
pattern and
creates pattern variable definitions for the pattern variables of
pattern.
Examples:
12.11.3 Error reporting
The current contextual syntax object, defaulting to
#f. It
determines the special form name that prefixes syntax errors created
by
wrong-syntax.
Raises a syntax error using the result of
(current-syntax-context) as the “major” syntax object and
the provided
stx as the specific syntax object. (The latter,
stx, is usually the one highlighted by DrRacket.) The error
message is constructed using the format string and arguments, and it
is prefixed with the special form name as described under
current-syntax-context.
Examples:
> (wrong-syntax #'here "expected ~s" 'there) |
eval:14:0: ?: expected there |
at: here |
|
eval:15:0: look: expected there |
at: here |
in: (look over here) |
A macro using
wrong-syntax might set the syntax context at the very
beginning of its transformation as follows:
Then any calls to
wrong-syntax during the macro’s
transformation will refer to
my-macro (more precisely, the name that
referred to
my-macro where the macro was used, which may be
different due to renaming, prefixing, etc).
12.11.4 Recording disappeared uses
Parameter for tracking disappeared uses. Tracking is “enabled” when
the parameter has a non-false value. This is done automatically by
forms like
with-disappeared-uses.
Evaluates the
stx-expr, catching identifiers looked up using
syntax-local-value/record. Adds the caught identifiers to the
'disappeared-uses syntax property of the resulting syntax
object.
Looks up
id in the syntactic environment (as
syntax-local-value). If the lookup succeeds and returns a
value satisfying the predicate, the value is returned and
id
is recorded as a disappeared use by calling
record-disappeared-uses.
If the lookup fails or if the value
does not satisfy the predicate,
#f is returned and the
identifier is not recorded as a disappeared use.
If not used within the extent of a with-disappeared-uses
form or similar, has no effect.
12.11.5 Miscellaneous utilities
Generates one fresh identifier. Singular form of
generate-temporaries. If
name-base is supplied, it
is used as the basis for the identifier’s name.
Applies the renamings of intdef-ctx to stx.
Evaluates stx as an expression in the current transformer
environment (that is, at phase level 1), optionally extended with
intdef-ctx.
Examples:
|
|
> (show-me (+ 2 5)) |
at compile time produces 7 | at run time produces 7 |
|
|
> (define-for-syntax fruit 'apple) |
|
> (define fruit 'pear) |
|
> (show-me fruit) |
at compile time produces apple | at run time produces pear |
|
|
Similar to
with-syntax, but the pattern variables of each
pattern are bound in the
stx-exprs of subsequent
clauses as well as the
bodys, and the
patterns need
not bind distinct pattern variables; later bindings shadow earlier
bindings.
Example:
|
#<syntax:21:0 ((val1) (val2))> |