当前位置:  开发笔记 > 编程语言 > 正文

关于和宏的来源

如何解决《关于和宏的来源》经验,为你挑选了1个好方法。

我正在浏览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)).



1> Thumbnail..:

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

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


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

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有