首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何让Clojure函数接受可变数量的参数?

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

Stack Overflow用户
提问于 2012-02-12 01:43:17
回答 4查看 49.8K关注 0票数 84

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

我能做的就是:

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-12 02:09:23

通常,在非交换情况下,可以使用apply

代码语言:javascript
复制
(defn sum [& args] (apply + args))

因为加法是可交换的,所以下面这样的代码也应该有效:

代码语言:javascript
复制
(defn sum [& args] (reduce + args))

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

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

代码语言:javascript
复制
(sum a b c d e ...)

你可以这样写:

代码语言:javascript
复制
(+ a b c d e ....)
票数 110
EN

Stack Overflow用户

发布于 2012-02-20 11:09:59

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

代码语言:javascript
复制
(defn special-sum
  ([] (+ 10 10))
  ([x] (+ 10 x))
  ([x y] (+ x y)))

(special-sum) => 20

(special-sum 50) => 60

(special-sum 50 25) => 75

票数 32
EN

Stack Overflow用户

发布于 2014-10-26 07:47:47

代码语言:javascript
复制
 (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))
  )
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9242440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档