添加一个和一个的功能:
(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的答案说明了宏与函数的不同之处。但不回答原因。隐喻地,我知道从高处离开的物体垂直下落到地面。我的问题是为什么它垂直下降?
答案 0 :(得分:2)
让我们从很多人都知道的事情开始,他们忘记在解释宏时会明确地考虑它,这会导致其他人在学习思考宏时感到困惑:
----------->宏是函数< -------------
它们经常用于获取看起来像代码的列表,并且经常需要返回实际可以作为代码运行的列表。
宏和函数之间的区别不是它(基本上)的作用,而是它的作用。 宏在代码为" loading" 时运行,并且它们返回的值在程序运行时运行。
当你把它写成宏时,它会执行两个步骤:
当你把它写成一个函数时,它会做一步:
然后停止。
返回值不同,因为宏版本采取了将返回值作为代码运行的额外步骤。
代码是数据......数据是代码... yay lisp!