Node:Quasiquotation, Previous:Delayed evaluation, Up:Derived expression types
quasiquote <qq template> | syntax |
` <qq template> | syntax |
"Backquote" or "quasiquote" expressions are useful
for constructing a list or vector structure when most but not all of the
desired structure is known in advance. If no
commas appear within the <qq template>, the result of
evaluating
`<qq template> is equivalent to the result of evaluating
'<qq template>. If a comma appears within the
<qq template>, however, the expression following the comma is
evaluated ("unquoted") and its result is inserted into the structure
instead of the comma and the expression. If a comma appears followed
immediately by an at-sign (@), then the following
expression must evaluate to a list; the opening and closing parentheses
of the list are then "stripped away" and the elements of the list are
inserted in place of the comma at-sign expression sequence. A comma
at-sign should only appear within a list or vector <qq template>.
`(list ,(+ 1 2) 4) ==> (list 3 4)
(let ((name 'a)) `(list ,name ',name))
==> (list a (quote a))
`(a ,(+ 1 2) ,@(map abs '(4 -5 6)) b)
==> (a 3 4 5 6 b)
`((
Quasiquote forms may be nested. Substitutions are made only for
unquoted components appearing at the same nesting level
as the outermost backquote. The nesting level increases by one inside
each successive quasiquotation, and decreases by one inside each
unquotation.
`(a `(b ,(+ 1 2) ,(foo ,(+ 1 3) d) e) f) ==> (a `(b ,(+ 1 2) ,(foo 4 d) e) f) (let ((name1 'x) (name2 'y)) `(a `(b ,,name1 ,',name2 d) e)) ==> (a `(b ,x ,'y d) e) The two notations
`<qq template> and (quasiquote <qq template>)
are identical in all respects.
(quasiquote (list (unquote (+ 1 2)) 4)) ==> (list 3 4) '(quasiquote (list (unquote (+ 1 2)) 4)) ==> `(list ,(+ 1 2) 4) i.e., (quasiquote (list (unquote (+ 1 2)) 4)) Unpredictable behavior can result if any of the symbols
|