function clojure lisp procedure

function - ¿Cómo hacer que una función Clojure tome una cantidad variable de parámetros?



lisp procedure (5)

defn es una macro que hace que las funciones de definición sean un poco más simples. Clojure admite la sobrecarga aria en un solo objeto de función, autorreferencia y funciones de aria variable que utilizan

Desde http://clojure.org/functional_programming

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

Todo lo que puedo hacer es:

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

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


En general, el caso no conmutativo que puedes usar apply :

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

Como la adición es conmutativa, algo así debería funcionar también:

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

& hace que args se vincule al resto de la lista de argumentos (en este caso, toda la lista, ya que no hay nada a la izquierda de & ).

Obviamente, definir suma así no tiene sentido, ya que en lugar de:

(sum a b c d e ...)

usted puede simplemente escribir:

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


Yehoanathan menciona la sobrecarga de arity, pero no proporciona un ejemplo directo. Esto es de 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


(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)) )


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

Esto toma cualquier cantidad de argumentos y los suma.