2014-02-13 30 views

回答

4
(fn [a b] (+ a b)) 

是一個函數,需要兩個參數,並返回它們的總和,讓我們來代替,如果有名稱fun1

(fn [] fun1) 

是一個函數,它沒有返回函數對象fun1。讓我們把這個新功能fun2

( 
    fun2 
) 

這裏我們稱之爲fun2,正如我們前面所討論的,回報功能fun1

(
    fun1 
4 5) 

這裏我們稱之爲fun1(從(fun2)返回)以2個參數 - 45。這給了我們9

(= 9 
    9) 

最後我們檢查2個數的相等。他們實際上是平等的。

你應該在這裏理解的主要事情是在Clojure中的功能也是一流的公民。您可以生成它們(如fun1),將它們傳遞給其他函數並從它們返回(如我們從fun2返回fun1)。因此,()的每一層都只是對函數的另一個調用(可能從其他函數返回)。

2

它在那裏評估由外fn創建的功能。

因此,依次爲:

(fn [a b] (+ a b) 

創建總結它的論據

(fn [] (fn [a b] (+ a b)) 

與採取零個參數和返回,總結它的參數的函數創建外部函數的內部函數。

( 
    (fn [] (fn [a b] (+ a b))) 
) 

強制評估外部函數(並返回它的結果 - 將兩個值相加的函數)。

記住當你在lisp中看到圓括號時,首先應該在你腦海中彈出的是它是函數/表單/宏對其參數的應用。