任何人都可以向我解释原因
((fn ([x] x)) 1)
工作并返回1? (在fn之后有一个“额外”括号组)不应该是以下吗?
((fn [x] x) 1)
此外,
((fn (([x] x))) 1)
(2“额外”括号组)失败,出现“CompilerException System.ArgumentException:参数声明([x] x)应该是一个向量”。为什么呢?
谢谢!
答案 0 :(得分:10)
额外的括号集允许您定义一个采用可变数量参数的函数。以下示例定义了一个可以接受一个参数或两个参数的函数:
(defn foo
([x] x)
([x y] (+ x y)))
您可以将此视为在单个名称下定义两个函数。根据您提供的参数数量,将调用相应的函数。
如果定义具有固定数量参数的函数,则以下两个形式是等效的:
(defn bar ([x] x))
和
(defn baz [x] x)
考虑到这一点,您可以理解编译器异常。您正尝试按如下方式定义函数:
(defn qux
(([x] x)))
当使用额外的括号集时,闭包期望parenthsesis中的第一个元素是一个向量(在括号内)。但是在这种情况下,第一个元素是([x] x)
,它是一个列表而不是一个向量。这是你得到的错误。