En Clojure,alcance Variable + eval en Clojure
(def x 3)
(eval '(prn x))
grabados 3, mientras que
(let [y 3]
(eval '(prn y)))
y
(binding [z 3] (eval '(prn z)))
generar un 'No se puede resolver var' excepción.
De acuerdo con http://clojure.org/evaluation, eval
, load-string
, etc. generan espacios de nombres temporales para evaluar sus contenidos. Por lo tanto, espero que ninguno de los ejemplos de código anteriores funcione, ya que (def x 3)
se realiza en mi espacio de nombres actual, no en el creado por eval
.
- ¿Por qué funciona la primera muestra de código y no las dos últimas?
- Como puedo
eval
un formulario con variables ligadas sin utilizardef
?
¡Gracias!
Tenga en cuenta que esto no funcionará en Clojure 1.3. Tendrás que usar '(declare ^: dinámico x)'. – danlei
¡Gracias! Ahora comprendo mi problema: asumí que el "alcance léxico nulo" también significaba un "espacio de nombres nulo", pero las pruebas rápidas revelan que 'eval' funciona dentro del espacio de nombres actual, por lo que tiene acceso a vars de espacio de nombres pero no variables léxicas Muy buena respuesta, ¡y tus enlaces también fueron útiles! – gilesc
¡De nada! Me alegra que haya ayudado. Además, gracias por aceptar. – danlei