Как заставить функцию Clojure принимать переменное количество параметров? - PullRequest
76 голосов
/ 11 февраля 2012

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

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

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

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

Ответы [ 5 ]

100 голосов
/ 11 февраля 2012

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

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

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

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

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

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

(sum a b c d e ...)

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

(+ a b c d e ....)
30 голосов
/ 20 февраля 2012

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

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

(special-sum) => 20

(special-sum 50) => 60

(special-sum 50 25) => 75

17 голосов
/ 26 октября 2014
 (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))
  )
10 голосов
/ 11 февраля 2012

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

С http://clojure.org/functional_programming

3 голосов
/ 23 июля 2015
(defn sum [& args]
  (print "sum of" args ":" (apply + args)))

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

...