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

rod*_*ves 77 lisp procedure function clojure

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

我能做的一切是:

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

当然,此功能仅需要两个参数和两个参数.请教我如何接受(和处理)未定义数量的参数.

sou*_*eck 102

一般情况下,您可以使用的非交换案例适用:

(defn sum [& args] (apply + args))
Run Code Online (Sandbox Code Playgroud)

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

(defn sum [& args] (reduce + args))
Run Code Online (Sandbox Code Playgroud)

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

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

(sum a b c d e ...)
Run Code Online (Sandbox Code Playgroud)

你可以写:

(+ a b c d e ....)
Run Code Online (Sandbox Code Playgroud)

  • 是的,没有目标,但它是你的答案的一个很好的例证.谢谢. (3认同)

小智 30

Yehoanathan提到arity重载但没有提供直接的例子.这是他在谈论的内容:

(defn special-sum
  ([] (+ 10 10))
  ([x] (+ 10 x))
  ([x y] (+ x y)))
Run Code Online (Sandbox Code Playgroud)

(special-sum) => 20

(special-sum 50) => 60

(special-sum 50 25) => 75

  • 也适用于 lambda:`(fn ([] (+ 10 10)) ([x] (+ 10 x)) ([xy] (+ xy)))` (2认同)

har*_*man 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))
  )
Run Code Online (Sandbox Code Playgroud)


vie*_*bel 10

defn是一个宏,使定义函数更简单.Clojure支持在单个函数对象,自引用和变量arity函数中使用的arity重载&

来自http://clojure.org/functional_programming