2012-05-23 16 views
5

Estoy intentando leer un poco en Clojure, pero chocó contra un muro de ladrillo con el siguiente ejemplo básico:no pueden entender este ejemplo clojure maquillaje sumador

(defn make-adder [x] 
    (let [y x] 
    (fn [z] (+ y z)))) 
(def add2 (make-adder 2)) 
(add2 4) 
-> 6 

Lo que no entiendo es como está add2 pasando el número 4 a la función make-adder, y cómo esa función turn asigna ese número a z.

¡Gracias de antemano!

Respuesta

6

make-adder devuelve una función que toma un parámetro (z), el parámetro pasado a make-adder se utiliza para asignar un valor a y. add2 se establece igual al resultado de evaluar make-adder con un parámetro de 2. Así add2 se fija igual a la función de regresar de make-adder, que (ya y se ha asignado al parámetro de make-adder) parece

(fn [z] (+ 2 z)) 

Así que (add2 4) llama a esta función que evalúa a 6. ¿Eso ayuda?

+0

¡Perfecto! Sí ayuda! ¡Muchas gracias! – Deleteman

+1

No creo que siquiera sea necesario, solo complica el código – Kevin

+0

@Kevin: correcto, el let no es útil aquí. –

3

Para mí, parece que estás trabajando en un problema interesante.

Su función ejemplo hacer sumador (reescrito sin dejar fijaciones)

(defn make-adder [x] 
    "Returns a function that returns the sum of x and yet to be supplied z." 
    (fn [z] (+ z x)))) 

devuelve una función que resume X y Z, en donde hacer sumador tiene que ya han sido llamados con un valor. Creo que su ejemplo está implementando la función parcial de Clojure, que es muy buena.

Aquí es su función make-adder reescrito para resumir sus dos parámetros, y no regresar una función (por lo que podemos utilizar parcial en ADD2),

(defn make-adder 
    "Returns sum of x and y." 
    [x y] 
    (+ x y)) 

y aquí se reescribe ADD2 utilizando parcial con 2 como el parámetro x:

(def add2 (partial make-adder 2)) 

Si llamo (add2 2) la respuesta es 4, (add2 3), la respuesta es 5, y así sucesivamente.

+0

Gracias por la explicación adicional. Todavía soy bastante nuevo para clojure, y por lo tanto, no estoy familiarizado con el concepto "parcial". Por eso es un poco difícil para mí entender completamente tu ejemplo. – Deleteman

Cuestiones relacionadas