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...?

Author: Prince John Wesley, 2009-10-06

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

Véase también Vars, let .

 103
Author: Brian Carper,
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
 12
Author: Marc,
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.

 9
Author: Yuval Adam,
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