2012-03-09 14 views
7

Estoy haciendo Intro to Functions problema, pero no entiendo muy bien lo que está pasando? ¿Cómo son las 4 expresiones a continuación diferentes? Si son todos iguales, ¿por qué tienen 4 sintaxis diferentes?Clojure Función Literales

(partial + 5) 
#(+ % 5) 
(fn [x] (+ x 5)) 
(fn add-five [x] (+ x 5)) 

Respuesta

18
  • (fn [x] (+ x 5)) y #(+ % 5) - Estos dos son completamente equivalentes, éste simplemente utiliza el dispatch macro para hacer el código un poco más concisa. Para funciones cortas, generalmente se prefiere la sintaxis #() y la sintaxis (fn [x]) es mejor para funciones que son un poco más largas. Además, si ha anidado funciones anónimas, no puede usar #() para ambos debido a la ambigüedad que esto causaría.

  • (fn add-five [x] (+ x 5)) - es lo mismo que los dos anteriores, excepto que tiene un nombre: add-five. Esto a veces puede ser útil, como si necesita hacer una llamada recursiva a su función. *

  • (partial + 5) - En clojure, + es una función variadica. Esto significa que puede aceptar cualquier cantidad de argumentos. (+ 1 2) y (+ 1 2 3 4 5 6) son ambos formularios perfectamente válidos. partial está creando una nueva función que es idéntica a +, excepto que el primer argumento es siempre 5. Debido a esto, ((partial + 5) 3 3 3) es válido. No podría usar los otros formularios en este caso.

* Al hacer una llamada recursiva desde la posición de cola, debe usar recur, sin embargo, esto no siempre es posible.