4

谁能向我解释为什么

((fn ([x] x)) 1)

工作并返回 1?(在 fn 之后有一组“额外的”括号)不应该是下面的吗?

((fn [x] x) 1)

此外,

((fn (([x] x))) 1)

(2 组“额外”括号)失败并出现“CompilerException System.ArgumentException:参数声明([x] x)应该是一个向量”。为什么?

谢谢!

4

1 回答 1

11

额外的一组括号允许您定义一个带有可变数量参数的函数。下面的示例定义了一个可以接受一个参数或两个参数的函数:

(defn foo
  ([x] x)
  ([x y] (+ x y)))

您可以将其视为在一个名称下定义两个函数。将根据您提供的参数数量调用适当的函数。

如果定义具有固定数量参数的函数,则以下两种形式是等效的:

(defn bar ([x] x))

(defn baz [x] x)

考虑到这一点,您可以理解编译器异常。您正在尝试按如下方式定义函数:

(defn qux 
  (([x] x)))

当使用额外的括号集时,闭包期望括号内的第一个元素是一个向量(在括号内)。但是在这种情况下,第一个元素是([x] x)列表而不是向量。这是你得到的错误。

于 2013-06-06T21:36:43.580 回答