1 .:
Причина, по которой это не работает, (более или менее) приведено на странице, которую вы связали:
It is an error if there is no global var named by the symbol […]
И:
[...]
blockquote>
eval
оценивает формы в пустой ( null в CL-lingo) лексической среде. Это означает, что вы не можете получить доступ к привязкам к лексической переменной из области вызова. Кроме того, binding
создает новые привязки для существующих vars, поэтому вы не можете использовать его «самостоятельно», не имея declare
d или def
редактируемые переменные, которые вы пытаетесь связать. Кроме того, лексические переменные (по крайней мере, в CL, но я был бы удивлен, если бы это было не так для Clojure) уже перестали существовать во время выполнения - они переведены на адреса или значения.
См. Также мои старше поста об этой теме.
2..:
Итак, вам нужно использовать динамические переменные. Вы можете избежать явного def
, но вам по крайней мере нужно declare
их (имена def
s var без привязок):
user=> (declare ^:dynamic x)
#'user/x
user=> (binding [x 10] (eval '(prn x)))
10
nil
Кстати: я полагаю, вы знаете почему вам нужно eval, и что его использование считается злом , когда другие решения будут подходящими.