2011-04-20 91 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)))。我認爲他指的是什麼。