Function 如何使Clojure函数接受数量可变的参数?

Function 如何使Clojure函数接受数量可变的参数?,function,clojure,lisp,procedure,Function,Clojure,Lisp,Procedure,我正在学习Clojure,我正在尝试定义一个函数,它接受可变数量的参数(一个可变函数)并将它们相加(是的,就像+过程一样)。然而,我不知道如何实现这样的功能 我能做的就是: (定义和[n1,n2](+n1 n2)) 当然,此函数只接受两个参数和两个参数。请教我如何使其接受(并处理)未定义数量的参数。通常,非交换情况下,您可以使用: 由于加法是可交换的,类似这样的东西也应该起作用: (defn sum [& args] (reduce + args)) &导致参数绑定到参数列表的其余部分

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

我能做的就是:

(定义和[n1,n2](+n1 n2))


当然,此函数只接受两个参数和两个参数。请教我如何使其接受(并处理)未定义数量的参数。

通常,非交换情况下,您可以使用:

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

(defn sum [& args] (reduce + args))
&
导致
参数
绑定到参数列表的其余部分(在本例中是整个列表,因为
&
左侧没有任何内容)

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

(sum a b c d e ...)
你可以写:

(+ a b c d e ....)
defn
是一个宏,它使定义函数变得更简单。 Clojure在单个函数对象中支持arity重载, 使用
&


中,Yehoanathan提到了算术重载,但没有提供一个直接的例子。以下是他所说的:

(defn special-sum
  ([] (+ 10 10))
  ([x] (+ 10 x))
  ([x y] (+ x y)))
(特别金额)
=>
20

(特别金额50)
=>
60

(特别金额50 25)
=>
75

 (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))
  )

这需要任意数量的论点并将它们相加。

是的,没有意义,但这是一个很好的例子来说明你的答案。谢谢。@soulcheck:有没有办法将
seq
传递给求和函数。例如:(sum'(1233))结果是6?@avichalp,这将是另一个函数。只需将
从其中一个中删除即可version@soulcheck:不,我的意思是使用相同的函数签名。我是clojure的新手,因此我可以在这里清楚地表达我的观点。我想知道的是,在python中,我可以使用*args,如果一个函数被定义为使用*args(例如
def fn(*args):pass
),我可以通过给出一个类似fn(*list of_args)的列表来调用它。我可以在clojure中做同样的事情吗?@avichap调用
def fn(*args):pass
不会是
fn([1,2,3])
,但是
fn(1,2,3)
(显然这取决于你到底想做什么,但我在这里试图遵循精神)@soulcheck-answer的副本也适用于lambdas:
(fn([]([](+10 10))(+10 x))([xy](+xy)))
 (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))
  )
(defn sum [& args]
  (print "sum of" args ":" (apply + args)))