使用“额外”括号定义函数

时间:2013-06-06 21:25:09

标签: clojure

任何人都可以向我解释原因

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

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

((fn [x] x) 1)

此外,

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

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

谢谢!

1 个答案:

答案 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),它是一个列表而不是一个向量。这是你得到的错误。