Обычно вы должны перебирать первый элемент сбора, который должен быть удален в отдельном списке, а затем удалять их за пределами каждого цикла (в любом случае это замаскированный цикл на основе итератора)
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, и что его использование считается злом , когда другие решения будут подходящими.
(declare ^:dynamic x)
. – danlei 3 June 2011 в 01:44eval
работает в текущем пространстве имен, поэтому он имеет доступ к пространствам имен, но не к лексическим переменным. Очень хороший ответ, и ваши ссылки были полезны! – gilesc 3 June 2011 в 18:10