为什么函数的返回值没有被评估,但是宏的返回值是?

时间:2016-07-06 14:09:39

标签: clojure

添加一个和一个的功能:

(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的答案说明了宏与函数的不同之处。但不回答原因。隐喻地,我知道从高处离开的物体垂直下落到地面。我的问题是为什么它垂直下降?

1 个答案:

答案 0 :(得分:2)

让我们从很多人都知道的事情开始,他们忘记在解释宏时会明确地考虑它,这会导致其他人在学习思考宏时感到困惑:

----------->宏是函数< -------------

它们经常用于获取看起来像代码的列表,并且经常需要返回实际可以作为代码运行的列表。

宏和函数之间的区别不是它(基本上)的作用,而是它的作用。 宏在代码为" loading" 时运行,并且它们返回的值在程序运行时运行。

当你把它写成宏时,它会执行两个步骤:

  • 运行该函数以生成列表
  • 将返回的列表作为代码运行以生成值

当你把它写成一个函数时,它会做一步:

  • 运行该函数以生成列表

然后停止。

返回值不同,因为宏版本采取了将返回值作为代码运行的额外步骤。

代码是数据......数据是代码... yay lisp!