47 lines
1.7 KiB
Racket
47 lines
1.7 KiB
Racket
#lang scribble/doc
|
|
@require[scribble/manual]
|
|
@require[scribble/eval]
|
|
@require["guide-utils.ss"]
|
|
|
|
@title{Quasiquoting}
|
|
|
|
[Explain why...]
|
|
|
|
@;------------------------------------------------------------------------
|
|
@section{Escapes: @scheme[quasiquote], @scheme[unquote], and @scheme[unquote-splicing]}
|
|
|
|
The @scheme[quasiquote] form is similar to @scheme[quote]:
|
|
|
|
@specform[(#,(schemekeywordfont "quasiquote") datum)]
|
|
|
|
However, for each @scheme[(#,(schemekeywordfont "unquote") _expr)]
|
|
that appears within the @scheme[_datum], the @scheme[_expr] is
|
|
evaluated to produce a value that takes the place of the
|
|
@scheme[unsyntax] sub-form.
|
|
|
|
@examples[
|
|
(eval:alts (#,(schemekeywordfont "quasiquote") (1 2 (#,(schemekeywordfont "unquote") (+ 1 2)) (#,(schemekeywordfont "unquote") (- 5 1))))
|
|
`(1 2 ,(+ 1 2), (- 5 1)))
|
|
]
|
|
|
|
The @scheme[unquote-splicing] form is similar to @scheme[unquote], but
|
|
its @scheme[_expr] must produce a list, and the
|
|
@scheme[unquote-splicing] form must appear in a context that produces
|
|
either a list or a vector. As the name suggests, the resulting list
|
|
is spliced into the context of its use.
|
|
|
|
@examples[
|
|
(eval:alts (#,(schemekeywordfont "quasiquote") (1 2 (#,(schemekeywordfont "unquote-splicing") (list (+ 1 2) (- 5 1))) 5))
|
|
`(1 2 ,@(list (+ 1 2) (- 5 1)) 5))
|
|
]
|
|
|
|
If a @scheme[quasiquote] form appears within an enclosing
|
|
@scheme[quasiquote] form, then the inner @scheme[quasiquote]
|
|
effectively cancels one layer of @scheme[unquote] and
|
|
@scheme[unquote-splicing] forms, so that a second @scheme[unquote]
|
|
or @scheme[unquote-splicing] is needed.
|
|
|
|
@;------------------------------------------------------------------------
|
|
@section{Abbreviating with @schememetafont{`}, @schememetafont{,}, and @schememetafont[",@"]}
|
|
|