+Quasiquoting: quasiquote and ‘ in The Racket Guide introduces quasiquote .
syntax
( quasiquote datum)
An unquote or unquote-splicing form is recognized in any of the following escaping positions within datum: in a pair, in a vector, in a box, in a prefab structure field after the name position, and in hash table value position (but not in a hash table key position). Such escaping positions can be nested to an arbitrary depth.
An unquote-splicing form must appear as the car of 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).
If unquote or unquote-splicing appears within quasiquote in an escaping position but in a way other than as (unquote expr) or (unquote-splicing expr), a syntax error is reported.
'(0 1 2)
'(0 3 4)
'(0 1 2 4)
unquote-splicing: contract violation
expected: list?
given: 1
'(0 . 1)
A quasiquote , unquote , or unquote-splicing form is typically abbreviated with `, ,, or ,@, respectively. See also Reading Quotes.
> `(012)'(0 1 2)
'(1 3 4)
'#s(stuff 1 3 4)
'#hash(("a" . 3))
> `#hash((,(+12). "a"))'#hash((,(+ 1 2) . "a"))
'(1 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.
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
`(,123)
a single tail '(23) is used for every evaluation of the quasiquote expression. When allocating fresh data, the quasiquote form allocates mutable vectors, mutable boxes and immutable hashes.
#f
#t
syntax
syntax