語法引用和取消引用

標準庫中的示例( 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# 將獲得相同的名稱