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.
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 ....)
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
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))
)
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&
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.
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