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