我正在浏览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)
因为参数x是一个表单,可能是任何表达式,可以在其中进行两次计算(if ~x (and ~@next) ~x)).在let一次评估,并使用了价值 x#之后.
因此,实际的代码避免了两次评估参数的影响 - 特别是副作用.
@amalloy指出仅在第一个实例计算false(y)时才评估表单x输入的第二个实例(if ~x (and ~@next) ~x)).
| 归档时间: |
|
| 查看次数: |
67 次 |
| 最近记录: |