let
crée un correspondant a une portée lexicale immuable alias pour une certaine valeur. binding
crée de la dynamique d'une portée contraignante pour certains Var
.
Liaison dynamique signifie que le code à l'intérieur de votre binding
forme et n'importe quel code qui code pour les appels (même si ce n'est dans les locaux de portée lexicale) voir la nouvelle liaison.
Donnée:
user> (def ^:dynamic x 0)
#'user/x
binding
crée en fait une liaison dynamique pour un Var
mais let
seulement des ombres de la var avec un alias local:
user> (binding [x 1] (var-get #'x))
1
user> (let [x 1] (var-get #'x))
0
binding
pouvez utiliser les noms complets (parce qu'il opère sur l' Var
s) et let
ne peut pas:
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
-introduit les liaisons ne sont pas mutables. binding
-introduit les liaisons sont thread-localement mutable:
user> (binding [x 1] (set! x 2) x)
2
user> (let [x 1] (set! x 2) x)
; Evaluation aborted.
;; Invalid assignment target
Lexicale vs de liaison dynamique:
user> (defn foo [] (println x))
#'user/foo
user> (binding [x 1] (foo))
1
nil
user> (let [x 1] (foo))
0
nil
Voir aussi Vars, laissez.