2012-02-11 24 views
73

Estoy aprendiendo Clojure y estoy tratando de definir una función que tome un número variable de parámetros (una función variada de ) y los resuma (sí, al igual que el procedimiento +). Sin embargo, no sé cómo implementar esta función¿Cómo hacer que una función Clojure tome una cantidad variable de parámetros?

Todo lo que puedo hacer es:

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

Por supuesto, esta función toma dos parámetros parameteres y dos solamente. Por favor, enséñeme cómo hacer que acepte (y procese) un número indefinido de parámetros.

Respuesta

93

En caso general, no conmutativa puede utilizar apply:

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

Puesto que la adición es conmutativa, algo como esto debería funcionar también:

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

& provoca args estar vinculado a la resto de la lista de argumentos (en este caso, toda la lista, ya que no hay nada a la izquierda de &).

Obviamente define como suma que no tiene sentido, ya que en lugar de:

(sum a b c d e ...) 

que sólo puede escribir:

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

Sí, no tiene sentido, pero es una buena ilustración de su respuesta. Gracias. – rodrigoalves

+0

@soulcheck: hay una manera de pasar un 'seq' a su función de suma. Por ejemplo: (sum '(1 2 3)) y el resultado es 6? – avichalp

+0

@avichalp esa sería otra función. simplemente elimine '&' de cualquier versión – soulcheck

10

defn es una macro que hace las funciones que definen un poco más simple. Clojure soporta sobrecarga aridad en un solo objeto de función, autorreferencia, y funciones Arity variable usando &

De http://clojure.org/functional_programming

26

Yehoanathan menciona aridad sobrecarga pero no proporciona un ejemplo directo. Esto es lo que está hablando:

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

(special-sum) =>20

(special-sum 50) =>60

(special-sum 50 25) =>75

15
(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)) 
) 
3
(defn sum [& args] 
    (print "sum of" args ":" (apply + args))) 

Esta toma cualquier num de argumentos y sumenlos.

+0

Duplicate of @soulcheck answer http://stackoverflow.com/a/9242671/1327651 – nha

Cuestiones relacionadas