2012-05-23 85 views
5

我試圖閱讀了關於Clojure的有點這個Clojure的化妝加法器的例子,但我撞到南牆以下基本例如:不能理解

(defn make-adder [x] 
    (let [y x] 
    (fn [z] (+ y z)))) 
(def add2 (make-adder 2)) 
(add2 4) 
-> 6 

我不明白add2是如何將數字4傳遞給make-addder函數的,以及該函數如何將該數字賦給z。

在此先感謝!

回答

6

make-adder返回帶有一個參數(z)的函數,傳入make-adder的參數用於爲y賦值。 add2被設置爲等於具有2所以add2的參數評估make-adder的結果被設定爲等於從make-adder,它(因爲y已經被分配給所述參數從make-adder)返回的函數看起來像

(fn [z] (+ 2 z)) 

所以(add2 4)稱這個函數的計算結果爲6.這有幫助嗎?

+0

完美!是的,它有幫助!非常感謝! – Deleteman

+1

我不認爲let甚至需要它使代碼複雜 – Kevin

+0

@Kevin:對,let在這裏沒有用處。 –

3

對我來說,看來你正在研究一個有趣的問題。

你的榜樣使加法器功能(不let綁定重寫)

(defn make-adder [x] 
    "Returns a function that returns the sum of x and yet to be supplied z." 
    (fn [z] (+ z x)))) 

返回總結x和z,其中使加法器必須已經調用值的函數。我相信你的例子是實現Clojure部分函數,​​這非常酷。

這裏是重寫來總結它的兩個參數,而不是返回一個函數(所以我們可以使用ADD2部分)你的化妝加法器功能,

(defn make-adder 
    "Returns sum of x and y." 
    [x y] 
    (+ x y)) 

,這裏是使用部分與2作爲ADD2改寫x參數:

(def add2 (partial make-adder 2)) 

如果我打電話(add2 2)答案是4,(add2 3),答案是5等。

+0

感謝您的額外解釋。我對clojure還很陌生,因此我不熟悉「部分」概念。這就是爲什麼我完全理解你的例子有點困難。 – Deleteman