quasiquote <template> | R5RS |
`<template> | R5RS |
"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 <template> ,
the result of evaluating `<template> is equivalent to the result of
evaluating '<template> . If a comma appears within the
<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 <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) `((foo ,(- 10 3)) ,@(cdr '(c)) . ,(car '(cons))) => ((foo 7) . cons) `#(10 5 ,(sqrt 4) ,@(map sqrt '(16 9)) 8) => #(10 5 2 4 3 8) 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 |