我正在浏览clojure.core的来源:
(defmacro and ([] true) ([x] x) ([x & next] `(let [and# ~x] (if and# (and ~@next) and#))))
为什么不呢
(defmacro and ([] true) ([x] x) ([x & next] `(if ~x (and ~@next) ~x)))
Thumbnail.. 9
因为参数x
是一个表单,可能是任何表达式,可以在其中进行两次计算(if ~x (and ~@next) ~x))
.在let
一次评估,并使用了价值 x#
之后.
因此,实际的代码避免了两次评估参数的影响 - 特别是副作用.
@amalloy指出仅在第一个实例计算false(y)时才评估表单x
输入的第二个实例(if ~x (and ~@next) ~x))
.
因为参数x
是一个表单,可能是任何表达式,可以在其中进行两次计算(if ~x (and ~@next) ~x))
.在let
一次评估,并使用了价值 x#
之后.
因此,实际的代码避免了两次评估参数的影响 - 特别是副作用.
@amalloy指出仅在第一个实例计算false(y)时才评估表单x
输入的第二个实例(if ~x (and ~@next) ~x))
.