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

发布于 2025-01-04 19:28:07 字数 221 浏览 2 评论 0原文

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

我能做的就是:

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

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

I'm learning Clojure and I'm trying to define a function that take a variable number of parameters (a variadic function) and sum them up (yep, just like the + procedure). However, I don´t know how to implement such function

Everything I can do is:

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

Of course this function takes two parameteres and two parameters only. Please teach me how to make it accept (and process) an undefined number of parameters.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

离笑几人歌 2025-01-11 19:28:07

一般来说,非交换的情况你可以使用 apply

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

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

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

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

显然这样定义 sum 是没有意义的,因为

(sum a b c d e ...)

你可以写:

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

In general, non-commutative case you can use apply:

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

Since addition is commutative, something like this should work too:

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

& causes args to be bound to the remainder of the argument list (in this case the whole list, as there's nothing to the left of &).

Obviously defining sum like that doesn't make sense, since instead of:

(sum a b c d e ...)

you can just write:

(+ a b c d e ....)
靑春怀旧 2025-01-11 19:28:07

Yehoanathan 提到了参数重载,但没有提供直接的例子。这就是他所说的:

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

(special-sum) =>; 20

(特殊总和 50) => 60

(特殊总和 50 25) => 75

Yehoanathan mentions arity overloading but does not provide a direct example. Here's what he's talking about:

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

(special-sum) => 20

(special-sum 50) => 60

(special-sum 50 25) => 75

孤凫 2025-01-11 19:28:07
 (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 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))
  )
与之呼应 2025-01-11 19:28:07

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

的自引用和可变数量函数

来自 http://clojure.org/function_programming

defn is a macro that makes defining functions a little simpler.
Clojure supports arity overloading in a single function object,
self-reference, and variable-arity functions using &

From http://clojure.org/functional_programming

仅一夜美梦 2025-01-11 19:28:07
(defn sum [& args]
  (print "sum of" args ":" (apply + args)))

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

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

This takes any number of arguments and add them up.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文