Quasiquoting: quasiquote and ‘ in The Racket Guide introduces quasiquote.
The same as
'datum if
datum does not include
(unquote expr) or
(unquote-splicing expr). An
(unquote expr) form escapes from the quote, however,
and the result of the
expr takes the place of the
(unquote expr) form in the
quasiquote result. An
(unquote-splicing expr) similarly escapes, but the
expr must produce a list, and its elements are spliced as
multiple values place of the
(unquote-splicing expr), which
must appear as the
car or a quoted pair, as an element of a
quoted vector, or as an element of a quoted
prefab structure;
in the case of a pair, if the
cdr of the relevant quoted pair
is empty, then
expr need not produce a list, and its result
is used directly in place of the quoted pair (in the same way that
append accepts a non-list final argument). In a quoted
hash table, an
(unquote expr) or
(unquote-splicing expr) expression escapes only in the
second element of an entry pair (i.e., the value), while entry keys
are always implicitly quoted. If
unquote or
unquote-splicing appears within
quasiquote in any
other way than as
(unquote expr) or
(unquote-splicing expr), a syntax error is reported.
A quasiquote, unquote, or unquote-splicing
form is typically abbreviated with `, ,, or
,@, respectively. See also Reading Quotes.
Examples: |
> `(0 1 2) | '(0 1 2) | > `(1 ,(+ 1 2) 4) | '(1 3 4) | > `#s(stuff 1 ,(+ 1 2) 4) | '#s(stuff 1 3 4) | > ‘#hash(("a" . ,(+ 1 2))) | '#hash(("a" . 3)) | > `#hash((,(+ 1 2) . "a")) | '#hash((,(+ 1 2) . "a")) | > `(1 ,@(list 1 2) 4) | '(1 1 2 4) | > `#(1 ,@(list 1 2) 4) | '#(1 1 2 4) |
|
A quasiquote form within the original datum
increments the level of quasiquotation: within the quasiquote
form, each unquote or unquote-splicing is preserved,
but a further nested unquote or unquote-splicing
escapes. Multiple nestings of quasiquote require multiple
nestings of unquote or unquote-splicing to escape.
Examples: |
> `(1 `,(+ 1 ,(+ 2 3)) 4) | '(1 `,(+ 1 5) 4) | > `(1 ```,,@,,@(list (+ 1 2)) 4) | '(1 ```,,@,3 4) |
|
The quasiquote form allocates only as many fresh cons cells,
vectors, and boxes as are needed without analyzing unquote
and unquote-splicing expressions. For example, in
`(,1 2 3)
a single tail '(2 3) is used for every evaluation of the
quasiquote expression.