06_function.clj包含这个问题,我无法弄清楚为什么在位置1和2中有一对额外的()因为位置3已经包含了括号。
"One function can beget another"
(= 9 (
( <---- 1
(fn [] (fn [a b] (+ a b))) <----3
) <-----2
4 5))
答案 0 :(得分:4)
(fn [a b] (+ a b))
是一个带有2个参数并返回其总和的函数,如果名称为fun1
,则替换为
(fn [] fun1)
是一个不带任何内容并返回函数对象fun1
的函数。我们称之为新函数fun2
(
fun2
)
在这里我们调用fun2
,正如我们之前讨论的那样,它返回函数fun1
(
fun1
4 5)
此处,我们使用2个参数调用fun1
(从(fun2)
返回) - 4
和5
。这给了我们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应用于它的参数。