2012-05-23 23 views
5

Sto cercando di leggere un po 'su Clojure, ma mi ha colpito un muro di mattoni con il seguente esempio di base:Non riesco a capire questo esempio clojure make-vipera

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

Quello che non capisco è come add2 passa il numero 4 alla funzione make-adder e in che modo la funzione turn assegna quel numero a z.

Grazie in anticipo!

risposta

6

make-adder restituisce una funzione che accetta un parametro (z), il parametro passato a make-adder viene utilizzato per assegnare un valore a y. add2 è impostato uguale al risultato della valutazione make-adder con un parametro di 2. Quindi add2 è impostata uguale alla funzione restituita da make-adder, che (poiché y è stato assegnato al parametro da make-adder) sembra

(fn [z] (+ 2 z)) 

Quindi (add2 4) chiama questa funzione che valuta a 6. Questo aiuta?

+0

Perfetto! Sì, aiuta! Molte grazie! – Deleteman

+1

Non credo che il let sia nemmeno necessario, ma complica il codice – Kevin

+0

@Kevin: giusto, il let non è utile qui. –

3

Per me, sembra che si stia lavorando su un problema interessante.

Il vostro esempio funzione di make-vipera (riscritto senza lasciare attacchi)

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

restituisce una funzione che somma X e Z, in cui il make-vipera deve aver già stato chiamato con un valore. Credo che il tuo esempio stia implementando la funzione parziale Clojure, che è piuttosto interessante.

Ecco la funzione make-vipera riscritto per riassumere i suoi due parametri, e non tornare una funzione (in modo che possiamo usare parziale ADD2),

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

e qui viene riscritta ADD2 usando parziale con 2 come il parametro x:

(def add2 (partial make-adder 2)) 

Se chiamo (add2 2) la risposta è 4, (add2 3), la risposta è 5 e così via.

+0

Grazie per la spiegazione extra. Sono abbastanza nuovo per clojure ancora, e quindi non ho familiarità con il concetto 'parziale'. Ecco perché è un po 'difficile per me capire completamente il tuo esempio. – Deleteman

Problemi correlati