如何使Clojure函数获取可变数量的参数?

我正在学习Clojure,我正在试图定义一个函数,它需要一个可变数量的参数(一个可变参数函数)并将它们相加(就像+程序一样)。 但是,我不知道如何实现这样的function

我能做的一切是:

(defn sum [n1, n2] (+ n1 n2))

当然这个函数只需要两个参数和两个参数。 请教我如何让它接受(和处理)一个未定义数量的参数。

一般情况下,你可以使用非交换情况apply :

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

既然加法是可交换的,像这样的东西也应该工作:

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

&会导致args被绑定到参数列表的其余部分(在这种情况下是整个列表,因为&的左边没有任何内容)。

显然定义这样的总和是没有意义的,因为不是:

 (sum abcde ...) 

你可以写:

 (+ abcde ....) 

Yehoanathan提到arity超载,但没有提供一个直接的例子。 以下是他正在谈论的内容:

 (defn special-sum ([] (+ 10 10)) ([x] (+ 10 x)) ([xy] (+ xy))) 

(special-sum) => 20

(special-sum 50) => 60

(special-sum 50 25) => 75

  (defn my-sum ([] 0) ; no parameter ([x] x) ; one parameter ([xy] (+ xy)) ; two parameters ([xy & more] ; more than two parameters (reduce + (my-sum xy) more)) ) 

defn是一个使定义函数更简单一些的macros。 Clojure支持单个函数对象中的arity重载,自引用和可变参数函数&

http://clojure.org/functional_programming

 (defn sum [& args] (print "sum of" args ":" (apply + args))) 

这需要任意数量的参数并将其添加。