2011-04-20 178 views
5

我有一個函數,它接受一個函數和一個數,並返回對數的函數的應用,以及一個立方體功能:傳遞函數作爲參數用Clojure

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

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

當我調用該函數如下它的工作原理:

(something cube 4) 

但這返回一個錯誤:

(something Math/sin 3.14) 

然而,這個工程:

(something #(Math/sin %) 3.14) 

什麼是解釋?

回答

13

Math.sin不是一個功能!這是一種直接來自Java的方法,並不瞭解Clojure函數必須遵循的各種規則。如果將它封裝在函數中,那麼該函數可以充當代理,將參數傳遞給「啞」方法並將結果返回到「智能」函數導向的上下文中。

+0

謝謝,現在我明白了。實際上,當這種混亂髮生時,我試圖理解宏。你能向我解釋這一行嗎? - '由於宏不評估它們的參數,可以將未加引號的函數名稱傳遞給它們,並且可以構造具有參數的函數調用。函數定義不能做到這一點,而是必須傳遞匿名函數,將函數調用到函數中。 – Pranav 2011-04-20 06:56:10

+0

我的困惑是,我已經明確地將一個沒有引號的函數'cube'傳遞給'something',並且工作正常。 – Pranav 2011-04-20 06:59:26

+1

你可以問這是一個真正的問題,而不是在評論中?這裏的格式非常暗淡,我不想爲完全不相關的問題添加「另一個答案」。 – amalloy 2011-04-20 07:38:39