84 votes

Comment faire en sorte qu'une fonction Clojure prenne un nombre variable de paramètres?

J'apprends Clojure et j'essaie de définir une fonction qui prend un nombre variable de paramètres (une fonction variadique ) et de les résumer (ouais, exactement comme pour la procédure +). Cependant, je ne sais pas comment implémenter une telle fonction

Tout ce que je peux faire, c'est:

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

Bien entendu, cette fonction ne prend que deux paramètres et deux paramètres. Apprenez-moi comment le faire accepter (et traiter) un nombre indéterminé de paramètres.

110voto

soulcheck Points 17680

Depuis que l'addition est commutative, quelque chose comme cela devrait fonctionner:

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

En général, la non-commutative cas, vous pouvez utiliser appliquent:

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

& provoque args d'être lié au reste de la liste d'arguments (dans ce cas, l'ensemble de la liste, comme il n'y a rien à gauche de l' &).

Évidemment, la définition de somme qui n'a pas de sens, puisque, au lieu de:

(sum a b c d e ...)

il vous suffit d'écrire:

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

32voto

Devin Walters Points 259

Yehoanathan mentionne la surcharge d’arités mais ne fournit pas d’exemple direct. Voici ce dont il parle:

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

(special-sum) => 20

(special-sum 50) => 60

(special-sum 50 25) => 75

17voto

hariszaman Points 591
 (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))
  )

10voto

viebel Points 1990

defn est une macro qui simplifie un peu la définition des fonctions. Clojure prend en charge la surcharge d'arités dans une fonction d'objet à fonction unique, d'auto-référence et d'arité variable utilisant &

De http://clojure.org/functional_programming

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X