我在本次Clojure教程中阅读了以下内容 - http://java.ociweb.com/mark/clojure/article.html#Macros
'由于宏不评估它们的参数,可以将不带引号的函数名称传递给它们,并且可以构造带参数的函数的调用。函数定义不能这样做,而是必须传递包含函数调用的匿名函数。
如果它是正确的,那么为什么这是有效的,因为函数多维数据集不是匿名的 -
(defn something [fn x]
(fn x))
(defn cube [x]
(* x x x))
(something cube 4)
答案 0 :(得分:4)
你是对的,这句话似乎不正确。我想它试图说的是你不能将看起来像函数调用的东西传递给一个没有引用的函数:
(some-function (bla 1 2 3))
在这种情况下,(bla 1 2 3)将被计算为函数调用,返回值将被传递给某个函数。
(some-macro (bla 1 2 3))
对于宏,传递的是 list (bla 1 2 3)
,然后可以通过插入参数或者执行其他操作来构造新的函数调用。< / p>
你可以肯定地将一个函数传递给你展示的另一个函数,这是一个完全记录和预期的技术。
答案 1 :(得分:-1)
defn是宏,代码扩展为,因为你需要匿名函数:(def something (fn [fn x] (fn x)))
。我认为他指的是什么。