it-swarm.com.de

Wie lässt man eine Clojure-Funktion eine variable Anzahl von Parametern annehmen?

Ich lerne Clojure und versuche, eine Funktion zu definieren, die eine variable Anzahl von Parametern (a variadic function) verwendet und diese zusammenfasst (yep, genau wie die + -Prozedur). Ich weiß jedoch nicht, wie ich eine solche Funktion implementieren soll

Alles was ich tun kann ist:

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

Diese Funktion akzeptiert natürlich nur zwei Parameter und zwei Parameter. Bitte bringen Sie mir bei, wie man eine undefinierte Anzahl von Parametern akzeptiert (und verarbeitet).

77
rodrigoalves

Im Allgemeinen können Sie in nicht kommutativem Fall anwenden verwenden:

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

Da die Addition kommutativ ist, sollte auch so etwas funktionieren:

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

& Bewirkt, dass args an den Rest der Argumentliste gebunden wird (in diesem Fall die gesamte Liste, da sich links von & Nichts befindet).

Offensichtlich macht es keinen Sinn, eine solche Summe zu definieren, da anstelle von:

(sum a b c d e ...)

du kannst einfach schreiben:

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

Yehoanathan erwähnt eine Überlastung der Arität, liefert jedoch kein direktes Beispiel. Hier ist, wovon er spricht:

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

(special-sum) => 20

(special-sum 50) => 60

(special-sum 50 25) => 75

30
Devin Walters
 (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
hariszaman

defn ist ein Makro, das das Definieren von Funktionen etwas vereinfacht. Clojure unterstützt das Überladen von Aritäten in einem einzelnen Funktionsobjekt, Selbstreferenz und Funktionen mit variabler Arität mit &

From http://clojure.org/functional_programming

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

Dies nimmt eine beliebige Anzahl von Argumenten und addiert sie.

3
amirt