如何使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重载,自引用和可变参数函数&
(defn sum [& args] (print "sum of" args ":" (apply + args)))
这需要任意数量的参数并将其添加。