Область видимости переменной + eval в Clojure

В Clojure

(def x 3)
(eval '(prn x))

печатает 3, тогда как

(let [y 3]
   (eval '(prn y)))

и

(binding [z 3] (eval '(prn z)))

генерируют исключение «Невозможно разрешить переменную».

Согласно http: / /clojure.org/evaluation, eval , load-string и т. д. создают временные пространства имен для оценки их содержимого. Поэтому я не ожидал, что ни один из приведенных выше примеров кода не сработает, поскольку (def x 3) выполняется в моем текущем пространстве имен, а не в том, которое создано eval .

  1. Почему работает первый пример кода, а не два последних?
  2. Как я могу оценить форму со связанными переменными без использования def ?

Спасибо!

18
задан Miikka 22 March 2015 в 10:39
поделиться