Clojure Koan中的语法问题 - 匿名函数有额外的()

时间:2014-02-13 12:32:05

标签: clojure

06_function.clj包含这个问题,我无法弄清楚为什么在位置1和2中有一对额外的()因为位置3已经包含了括号。

"One function can beget another"
  (= 9 (
        (   <---- 1
         (fn [] (fn [a b] (+ a b)))  <----3
         )  <-----2
        4 5))

2 个答案:

答案 0 :(得分:4)

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

是一个带有2个参数并返回其总和的函数,如果名称为fun1,则替换为

(fn [] fun1) 

是一个不带任何内容并返回函数对象fun1的函数。我们称之为新函数fun2

( 
  fun2
) 

在这里我们调用fun2,正如我们之前讨论的那样,它返回函数fun1

(
  fun1
4 5)

此处,我们使用2个参数调用fun1(从(fun2)返回) - 45。这给了我们9

(= 9
  9) 

最后我们检查2个数字的相等性。他们实际上是平等的。

这里你应该理解的主要是Clojure中的功能也是一等公民。您可以生成它们(如fun1),将它们传递给其他函数并从它们返回(就像我们从fun1返回fun2)。因此,()的每一层都只是对函数的另一个调用(可能从其他函数返回)。

答案 1 :(得分:2)

它用于评估外部fn创建的函数。

所以,反过来:

(fn [a b] (+ a b)

创建内部函数,对其参数进行求和

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

使用零参数创建外部函数,并返回一个对其参数求和的函数。

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

强制评估外部函数(并返回它的结果 - 一个将两个值相加的函数)。

请记住当你在lisps中看到括号时,你脑海中应该首先看到的是它是函数/ form / macro应用于它的参数。