32

我正在浏览 clojure 源代码,我对 when 宏的定义方式感到惊讶:

user=> (source when)
(defmacro when
  "Evaluates test. If logical true, evaluates body in an implicit do."
  {:added "1.0"}
  [test & body]
  (list 'if test (cons 'do body)))
nil
user=>

我原以为它会写成这样:

(defmacro when [test & body] `(if ~test (do ~@body)))

为什么实际的宏是以这种不太常见的方式编写的?

4

1 回答 1

68

core.clj 是从上到下构建的,从 Java 提供的内容开始,并逐步构建 Clojure 的所有要求。何时when定义语法引用尚不存在。
when宏在core.clj 的第 456 行定义,语法引用的要求直到第 682 行才可用。when 宏用于定义语法引用

于 2012-08-03T23:21:07.137 回答