Read и Eval не могут разрешать символы в локальной области [duplicate]

Обычно вы должны перебирать первый элемент сбора, который должен быть удален в отдельном списке, а затем удалять их за пределами каждого цикла (в любом случае это замаскированный цикл на основе итератора)

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

1 ответ

1 .:

Причина, по которой это не работает, (более или менее) приведено на странице, которую вы связали:

It is an error if there is no global var named by the symbol […]

И:

< blockquote>

[...]

  1. В текущем пространстве имен выполняется поиск, чтобы увидеть, есть ли отображение из символа в var. Если это так, значение является значением привязки символа var, обозначаемого символом.
  2. Это ошибка.

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, и что его использование считается злом , когда другие решения будут подходящими.

15
ответ дан Taylor Wood 16 August 2018 в 00:25
поделиться
  • 1
    Обратите внимание, что это не будет работать в Clojure 1.3. Вам нужно будет использовать (declare ^:dynamic x). – danlei 3 June 2011 в 01:44
  • 2
    Благодаря! Теперь я понимаю свою проблему - я предполагал, что «нулевая лексическая область действия» также означает «пустое пространство имен», но быстрое тестирование показывает, что eval работает в текущем пространстве имен, поэтому он имеет доступ к пространствам имен, но не к лексическим переменным. Очень хороший ответ, и ваши ссылки были полезны! – gilesc 3 June 2011 в 18:10
  • 3
    Пожалуйста! Я рад, что это помогло. Кроме того, спасибо за принятие. – danlei 3 June 2011 в 18:53
  • 4
    Я думаю, вы должны процитировать внутренний (prn x). – pkaleta 22 December 2011 в 14:44
  • 5
    безумный, хороший улов! – danlei 22 December 2011 в 18:31
Другие вопросы по тегам:

Похожие вопросы: