R4RS 4.2.6 Quasiquotation

(quasiquote <template>) ==> datum
`<template> ==> datum

(unquote expression) ==> obj
,expression ==> obj

(unquote-splicing expression) ==> list
,@expression ==> list

"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.

`(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 ,(+ 1 1) ,@(map - '(4 9)) 8)
  ==>  #(10 5 2 -4 -9 8)

The notations `<template> and (quasiquote <template>) are identical
in all respects. `,<expression>' is identical to `(unquote
<expression>)', and `,@<expression>' is identical to `(unquote-splicing
<expression>)'. The external syntax generated by write for two-element
lists whose car is one of these symbols may vary between implementations.

(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 QUASIQUOTE,
UNQUOTE, or UNQUOTE-SPLICING appear in positions within a <template>
otherwise than as described above.
