Как сделать функцию Clojure принимать переменное количество параметров?

Я изучаю Clojure, и я пытаюсь определить функцию, которая принимает переменное количество параметров (вариационную функцию) и суммирует их (да, как и процедура +). Однако я не знаю, как реализовать такую ​​функцию

Все, что я могу сделать, это:

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

Конечно, эта функция принимает только два параметра и только два параметра. Пожалуйста, научите меня, как заставить его принимать (и обрабатывать) число параметров undefined.

Ответ 1

В общем случае, некоммутативный случай, вы можете использовать apply:

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

Поскольку сложение является коммутативным, что-то вроде этого тоже должно работать:

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

& вызывает привязку args к остальной части списка аргументов (в этом случае весь список, так как ничего не осталось от &).

Очевидно, что определение такой суммы не имеет смысла, поскольку вместо:

(sum a b c d e ...)

вы можете просто написать:

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

Ответ 2

Yehoanathan упоминает перегрузку arity, но не дает прямого примера. Вот о чем он говорит:

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

(special-sum) = > 20

(special-sum 50) = > 60

(special-sum 50 25) = > 75

Ответ 3

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

Ответ 4

defn - макрос, который упрощает определение функций. Clojure поддерживает перегрузку arity в одном объекте функции, функции самореференции и переменной функции с помощью &

От http://clojure.org/functional_programming

Ответ 5

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

Это принимает любое количество аргументов и добавляет их.