Vamos a vs Unión en Clojure
Entiendo que son diferentes, ya que uno trabaja para establecer *compile-path*
y uno no. Sin embargo, necesito ayuda con por qué son diferentes.
let
crea un nuevo ámbito con los enlaces dados, pero binding
...?
3 answers
let
crea un alias inmutable de ámbito léxico para algún valor. binding
crea un enlace de ámbito dinámico para algunos Var
.
Enlace dinámico significa que el código dentro de su formulario binding
y cualquier código que ese código llame (incluso si no está en el ámbito léxico local) verá el nuevo enlace.
Dado:
user> (def ^:dynamic x 0)
#'user/x
binding
en realidad crea un enlace dinámico para un Var
pero let
solo sombrea el var con un alias local:
user> (binding [x 1] (var-get #'x))
1
user> (let [x 1] (var-get #'x))
0
binding
puede utilizar calificado nombres (ya que opera en Var
s) y let
no puede:
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
-los enlaces introducidos no son mutables. binding
- los enlaces introducidos son mutables localmente:
user> (binding [x 1] (set! x 2) x)
2
user> (let [x 1] (set! x 2) x)
; Evaluation aborted.
;; Invalid assignment target
Enlace léxico vs. dinámico:
user> (defn foo [] (println x))
#'user/foo
user> (binding [x 1] (foo))
1
nil
user> (let [x 1] (foo))
0
nil
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-14 14:31:43
Una diferencia sintáctica más para let vs binding:
Para el enlace, todos los valores iniciales se evalúan antes de que cualquiera de ellos se vincule a los vars. Esto es diferente de let, donde puede usar el valor de un "alias" anterior en una definición posterior.
user=>(let [x 1 y (+ x 1)] (println y))
2
nil
user=>(def y 0)
user=>(binding [x 1 y (+ x 1)] (println y))
1
nil
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-21 02:53:01
binding
vincula un valor a un nombre en el entorno global por hilo
Como mencionaste, let
crea un nuevo ámbito para dichos enlaces.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-06 02:16:03