06_function.clj包含這個問題,我不明白爲什麼在位置1和2有一對額外的(),因爲位置3已經有括號包裹向上。Clojure Koan中的語法問題 - 匿名函數有額外的()
"One function can beget another"
(= 9 (
( <---- 1
(fn [] (fn [a b] (+ a b))) <----3
) <-----2
4 5))
06_function.clj包含這個問題,我不明白爲什麼在位置1和2有一對額外的(),因爲位置3已經有括號包裹向上。Clojure Koan中的語法問題 - 匿名函數有額外的()
"One function can beget another"
(= 9 (
( <---- 1
(fn [] (fn [a b] (+ a b))) <----3
) <-----2
4 5))
(fn [a b] (+ a b))
是一個函數,需要兩個參數,並返回它們的總和,讓我們來代替,如果有名稱fun1
(fn [] fun1)
是一個函數,它沒有返回函數對象fun1
。讓我們把這個新功能fun2
(
fun2
)
這裏我們稱之爲fun2
,正如我們前面所討論的,回報功能fun1
(
fun1
4 5)
這裏我們稱之爲fun1
(從(fun2)
返回)以2個參數 - 4
和5
。這給了我們9
(= 9
9)
最後我們檢查2個數的相等。他們實際上是平等的。
你應該在這裏理解的主要事情是在Clojure中的功能也是一流的公民。您可以生成它們(如fun1
),將它們傳遞給其他函數並從它們返回(如我們從fun2
返回fun1
)。因此,(
和)
的每一層都只是對函數的另一個調用(可能從其他函數返回)。
它在那裏評估由外fn
創建的功能。
因此,依次爲:
(fn [a b] (+ a b)
創建總結它的論據
(fn [] (fn [a b] (+ a b))
與採取零個參數和返回,總結它的參數的函數創建外部函數的內部函數。
(
(fn [] (fn [a b] (+ a b)))
)
強制評估外部函數(並返回它的結果 - 將兩個值相加的函數)。
記住當你在lisp中看到圓括號時,首先應該在你腦海中彈出的是它是函數/表單/宏對其參數的應用。