2011-04-20 51 views
4

我阅读本教程的Clojure以下行 - http://java.ociweb.com/mark/clojure/article.html#Macros宏和功能Clojure中

“由于宏不评价他们的论据,不带引号的函数名可以传递给他们,并要求以参数的功能可以构建。函数定义不能做到这一点,而是必须传递匿名函数,将函数调用到函数中。

如果它是正确的,那么为什么这个工作,因为函数立方体不anonymous-

(defn something [fn x] 
    (fn x)) 

(defn cube [x] 
    (* x x x)) 

(something cube 4) 
+0

您正在将函数'cube'传递给'something',而不仅仅是它的名字。 – 2011-04-20 10:00:27

回答

4

你说得对,那报价似乎并不正确。我认为什么它想说的是,你不能传递的东西,看起来像一个函数调用没有引用的函数:

(some-function (bla 1 2 3)) 

在这种情况下,(BLA 1 2 3)将被评估为函数调用并且返回值将被传递给某个函数。

(some-macro (bla 1 2 3)) 

在宏的情况下,什么传递的是列表(bla 1 2 3),然后可以使用插入的参数来构建一个新的函数调用,或做其他事。

当然,你仍然可以将一个函数传递给另一个函数,这是一个完整的文档和预期的使用技巧。

-1

defn是s宏,代码扩展为,因为您需要匿名函数:(def something (fn [fn x] (fn x)))。我认为他指的是什么。