let
erstellt einen lexikalisch begrenzten unveränderlichen Alias für einen bestimmten Wert. binding
erstellt eine dynamisch begrenzte Bindung für einige Var
.
Dynamische Bindung bedeutet, dass der Code in Ihrem binding
Formular und Code, der diesen Code aufruft (auch wenn nicht im lokalen lexikalischen Bereich) die neue Bindung sehen wird.
Gegeben:
user> (def ^:dynamic x 0)
#'user/x
binding
tatsächlich schafft ein dynamisches für eine Var
Bindung aber let
Schatten nur die var mit einem lokalen Alias:
user> (binding [x 1] (var-get #'x))
1
user> (let [x 1] (var-get #'x))
0
binding
können qualifizierte Namen verwenden (da es arbeitet auf Var
s) und let
kann nicht:
user> (binding [user/x 1] (var-get #'x))
1
user> (let [user/x 1] (var-get #'x))
; Evaluation aborted.
;; Can't let qualified name: user/x
let
-eingeführte Bindungen sind nicht änderbar. binding
-introduced Bindungen sind gewinde lokal veränderliches:
user> (binding [x 1] (set! x 2) x)
2
user> (let [x 1] (set! x 2) x)
; Evaluation aborted.
;; Invalid assignment target
Lexical vs. dynamische Bindung:
user> (defn foo [] (println x))
#'user/foo
user> (binding [x 1] (foo))
1
nil
user> (let [x 1] (foo))
0
nil
Siehe auch Vars, let.
Dieses Plus http://en.wikipedia.org/wiki/Scope_(programming)#Static_versus_dynamic_scoping wirklich mein Verständnis vorangetrieben. Danke mein Herr! – Carl
Das x muss mit dem ^: dynamischen Hinweis verbunden sein, um keinen Fehler zu erzeugen, ich bleibe. – WeGi