如何使Clojure函数采用可变数量的参数?

时间:2012-02-11 17:43:17

标签: function clojure lisp procedure

我正在学习Clojure,我正在尝试定义一个函数,该函数采用可变数量的参数(可变参数函数)并将它们相加(是的,就像+过程一样)。但是,我不知道如何实现这样的功能

我所能做的就是:

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

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

5 个答案:

答案 0 :(得分:98)

一般情况下,非交换案例可以使用apply

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

由于加法是可交换的,所以这样的东西也应该起作用:

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

&会导致args绑定到参数列表的其余部分(在本例中为整个列表,因为&左侧没有任何内容)。

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

(sum a b c d e ...)

你可以写:

(+ a b c d e ....)

答案 1 :(得分:30)

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

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

(special-sum) => 20

(special-sum 50) => 60

(special-sum 50 25) => 75

答案 2 :(得分:17)

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


    (reduce + (my-sum x y) more))
  )

答案 3 :(得分:10)

  

defn是一个宏,它使定义函数更简单一些。   Clojure支持单个函数对象中的arity重载,   使用&

的自引用和变量函数

来自http://clojure.org/functional_programming

答案 4 :(得分:3)

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

这需要任意数量的参数并将它们加起来。