1

这个功能

(defn sum [& args] (apply + args))

应该总结所有 args 序列元素抛出异常。为什么?

user> (defn sum [& args] (apply + args))
#'user/sum
user> (sum [1 2 3])
ClassCastException   java.lang.Class.cast (Class.java:2999)
user> (sum (range 1 10))
ClassCastException   java.lang.Class.cast (Class.java:2999)

(也用作此问题中的示例(不为我编译)如何使 Clojure 函数采用可变数量的参数?

我在 Emacs 24.2 Live with Clojure 1.5.1 中使用 nrepl

4

2 回答 2

3

当您使用 指定函数参数时& args,这意味着args它将包含所有其他函数参数的列表。在这种情况下,sum正在获取其所有参数的列表——但它的参数已经是一个列表,所以实际上sum这里所做的是

(apply + [[1 2 3]])

如果您摆脱' 参数&的定义中sum的 (以便列表只是[args]),您将得到您想要的。

于 2013-05-22T16:20:55.977 回答
0

试试下面的。在 Clojure 中,变量参数是列表本身

(sum 1 2 3)
于 2013-05-22T16:25:55.010 回答