DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH PRINT BOOK
 

(r5rs.info.gz) Quasiquotation

Info Catalog (r5rs.info.gz) Delayed evaluation (r5rs.info.gz) Derived expression types
 
 4.2.6 Quasiquotation
 --------------------
 
  -- syntax: quasiquote <qq template>
  -- syntax: `<qq template>
      "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)
      `((`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  `<qq template> and (quasiquote <qq 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 <qq template> otherwise than as described above.
 
 
Info Catalog (r5rs.info.gz) Delayed evaluation (r5rs.info.gz) Derived expression types
automatically generated byinfo2html