关于和宏的来源

dam*_*onh 3 clojure

我正在浏览clojure.core的来源:

(defmacro and
  ([] true)
  ([x] x)
  ([x & next]
   `(let [and# ~x]
      (if and# (and ~@next) and#))))
Run Code Online (Sandbox Code Playgroud)

为什么不呢

(defmacro and
  ([] true)
  ([x] x)
  ([x & next]
   `(if ~x (and ~@next) ~x)))
Run Code Online (Sandbox Code Playgroud)

Thu*_*ail 9

因为参数x是一个表单,可能是任何表达式,可以在其中进行两次计算(if ~x (and ~@next) ~x)).在let一次评估,并使用了价值 x#之后.

因此,实际的代码避免了两次评估参数的影响 - 特别是副作用.


@amalloy指出仅在第一个实例计算false(y)时才评估表单x输入的第二个实例(if ~x (and ~@next) ~x)).