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