语法引用和取消引用

标准库中的示例( core.clj:807 ):

(defmacro and
  "Evaluates exprs one at a time, from left to right. If a form
  returns logical false (nil or false), and returns that value and
  doesn't evaluate any of the other expressions, otherwise it returns
  the value of the last expr. (and) returns true."
  {:added "1.0"}
  ([] true)
  ([x] x)
  ([x & next]
   `(let [and# ~x]
      (if and# (and ~@next) and#))))
  • `叫做 syntax-quote 就像 (quote),但是递归:它会导致 (let …)(if …) 等在宏扩展期间不进行评估,而是按原样输出
  • ~ aka unquote 取消语法引用形式内单个表单的语法引用。因此在扩展宏时输出 x 的值(而不是输出 x 符号)
  • ~@ aka unquote-splicing 就像 unquote 但是接受 list 参数并扩展它,每个列表项分离形式
  • # 将唯一 ID 附加到符号以防止名称冲突。它在语法引用的表达式中为同一个符号附加相同的 id,因此 let 内的 and#if 内的 and# 将获得相同的名称