【发布时间】:2016-11-08 15:08:11
【问题描述】:
加一加一的函数:
(defn one-plus-one [] (list + 1 1))
调用时返回:
(#object[clojure.core$_PLUS_ 0x47fa7bd5 "clojure.core$_PLUS_@47fa7bd5"] 1 1)
同样的函数体包裹在一个宏中:
(defmacro one-plus-one [] (list + 1 1))
调用时返回:
2
为什么 Clojure 期望宏返回可以计算的表达式?
编辑
the possible duplicate question 的答案告诉我们宏与函数有何不同。但没有回答为什么。打个比方,我知道从高处留下的物体垂直落下撞击地面。我的问题是为什么它垂直下降?
【问题讨论】:
-
我猜你应该阅读更多关于宏的信息。您可以将宏调用视为在编译时用宏的内容替换自身的代码。因此,对于宏一加一,您可以想象
(one-plus-one)将(+ 1 1)放入您的源代码中,然后将其与源代码的其余部分一起评估。 -
重新编辑,引用linked question,函数转换值,宏将代码转换成其他代码。
-
您的函数示例只是返回一个列表结构,这就是您定义它要做的事情。您的宏扩展为代码
(+ 1 1),当该代码被评估时,结果为 2。您可以通过运行(macroexpand '(one-plus-one))查看中间代码。 -
“为什么 Clojure 期望宏返回可以计算的表达式?”因为这就是拥有宏的意义所在。您的问题听起来好像在问“为什么宏的行为类似于宏?”我认为你真的想问 Sam Estep 提到的问题之一,所有这些问题都是关于合理的问题。
标签: clojure