Jak sprawić, by funkcja Clojure przyjmowała zmienną liczbę parametrów?

Uczę się Clojure i próbuję zdefiniować funkcję, która przyjmuje zmienną liczbę parametrów (Funkcja zmienna ) i sumuje je (tak, tak jak procedura+). Jednak nie wiem jak zaimplementować taką funkcję

Wszystko co mogę zrobić to:

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

Oczywiście ta funkcja przyjmuje tylko dwa parametry i tylko dwa parametry. Proszę, Naucz mnie, jak sprawić, by zaakceptował (i przetworzył) niezdefiniowaną liczbę parametrów.

Author: rodrigoalves, 2012-02-11

5 answers

Ogólnie rzecz biorąc, przypadek nieprzemienny można użyć zastosuj :

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

Ponieważ dodawanie jest przemienne, coś takiego też powinno działać:

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

& powoduje powiązanie args z pozostałą częścią listy argumentów(w tym przypadku z całą listą, ponieważ nie ma nic po lewej stronie &).

Oczywiście definiowanie takiej sumy nie ma sensu, ponieważ zamiast:

(sum a b c d e ...)

Możesz po prostu napisać:

(+ a b c d e ....)
 95
Author: soulcheck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-21 20:25:39

Yehoanathan wspomina o przeciążeniu arity, ale nie podaje bezpośredniego przykładu. Oto o czym on mówi:

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

(special-sum) => 20

(special-sum 50) => 60

(special-sum 50 25) => 75

 28
Author: Devin Walters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-20 03:09:58
 (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))
  )
 16
Author: hariszaman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-25 23:47:46

defn jest makrem, które sprawia, że definiowanie funkcji jest nieco prostsze. Clojure obsługuje przeciążenie arity w jednym obiekcie funkcji, self-reference, oraz funkcje zmienno-arytmetyczne przy użyciu &

Od http://clojure.org/functional_programming

 10
Author: viebel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-11 19:49:13
(defn sum [& args]
  (print "sum of" args ":" (apply + args)))

To pobiera dowolną liczbę argumentów i sumuje je.

 3
Author: ateymuri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-18 15:36:09