2012-07-19 12 views
5

Estoy discutiendo el cierre con un amigo y él piensa (partial + 5) es un cierre. Pero creo que un cierre es un cierre de función sobre una variable libre, por ejemploes esta función parcial un cierre?

(let [a 10] 
    (defn func1 [x] (+ x a)) 
) 

continuación func1 es un cierre. Pero en este caso 5 no es una variable libre. Entonces, ¿cuál es la respuesta correcta?

+0

Si bien la respuesta aceptada es correcta en términos de implementación, yo diría que no se debe considerar un cierre, sino más bien "solo" una aplicación parcial. El uso de un cierre es un detalle de implementación interna que no está directamente expuesto a la persona que llama. – user2864740

Respuesta

7

partial utiliza un cierre para realizar la función parcial. Consulte el código de partial utilizando (source partial) en repl y verá que utiliza cierres.

(defn partial 
    "Takes a function f and fewer than the normal arguments to f, and 
    returns a fn that takes a variable number of additional args. When 
    called, the returned function calls f with args + additional args." 
    {:added "1.0"} 
    ([f arg1] 
    (fn [& args] (apply f arg1 args))) 
    ([f arg1 arg2] 
    (fn [& args] (apply f arg1 arg2 args))) 
    ([f arg1 arg2 arg3] 
    (fn [& args] (apply f arg1 arg2 arg3 args))) 
    ([f arg1 arg2 arg3 & more] 
    (fn [& args] (apply f arg1 arg2 arg3 (concat more args))))) 
+0

¿Por qué está escrito así? Estoy aprendiendo ahora mismo y [f arg1] parece redundante ya que hay una implementación "varargs" (la que tiene & más) – themistoklik

+0

Una apuesta segura sería optimizar los casos más comunes – Sushisource

0

(partial + 5) es una función anónima o "lambda".

Las funciones anónimas a menudo se denominan "cierres", pero es un abuso del término; véase el análisis de "What is the difference between a 'closure' and a 'lambda'?"


[¹] Tal vez porque en los idiomas más populares que los apoyan, los cierres y las funciones anónimas se crean usando las mismas características del lenguaje - que los hace indistinguibles a primera vista.

Cuestiones relacionadas