2012-05-23 5 views
5

Ich versuche, ein bisschen auf Clojure zu lesen, aber ich traf eine Mauer mit dem folgenden einfachen Beispiel:kann nicht verstehen, diese clojure Make-Addierer Beispiel

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

Was ich nicht verstehe, ist, wie ist add2 die Nummer 4 an die Make-Addierer-Funktion übergeben, und wie weist diese Funktion wiederum diese Nummer zu z.

Vielen Dank im Voraus!

Antwort

6

make-adder gibt eine Funktion zurück, die einen Parameter (z) akzeptiert, der an make-adder übergebene Parameter wird verwendet, um y einen Wert zuzuweisen. add2 wird gleich dem Ergebnis der make-adder mit einem Parameter von 2. So Auswertung add2 gesetzt ist gleich wieder in die Funktion von make-adder, die (da y auf den Parameter von make-adder zugewiesen wurde) sieht aus wie

(fn [z] (+ 2 z)) 

Also ruft (add2 4) diese Funktion auf, die zu 6 auswertet. Hilft das?

+0

Perfekt! Ja, es hilft! Danke vielmals! – Deleteman

+1

Ich glaube nicht, dass die let ist sogar benötigt es kompliziert nur den Code – Kevin

+0

@Kevin: Richtig, das ist nicht hier nützlich. –

3

Für mich scheint es, dass Sie an einem interessanten Problem arbeiten.

Ihr Beispiel Make-Addiererfunktion (neu geschrieben ohne Bindungen lassen)

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

gibt eine Funktion, die x und z summiert, wo bereits Make-Addierer wurde mit einem Wert aufgerufen haben hat. Ich glaube, Ihr Beispiel implementiert die Clojure-Teilfunktion, die ziemlich cool ist.

Hier ist Ihr Make-Addiererfunktion neu geschrieben seine beiden Parameter zu summieren, und nicht eine Funktion zurückgeben (also können wir teilweise Verwendung in add2) mit 2 add2 rewritten teilweise unter Verwendung von hier,

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

und ist die x Parameter:

(def add2 (partial make-adder 2)) 

Wenn ich (add2 2) die Antwort 4 nennen, (add2 3), ist die Antwort 5 und so weiter.

+0

Danke für die zusätzliche Erklärung. Ich bin noch relativ neu und kenne daher das "Partial" -Konzept nicht. Deshalb ist es für mich ein bisschen schwierig, Ihr Beispiel vollständig zu verstehen. – Deleteman