В Clojure представлены переменные, определяемые через with-local-vars
, доступными через закрытие?Clojure with-local-vars в закрытии
Рассмотрим следующий пример:
(defn foo []
(with-local-vars [bar 10]
(fn [] @bar)))
((foo))
Результат выглядит следующим образом: (. Вместо этого, я ожидал получить 10
)
#object[clojure.lang.Var$Unbound 0x131f68d8 "Unbound: #<Var: --unnamed-->"]
C.F. в том числе:
(defn foo []
(with-local-vars [bar 10] @bar))
(foo)
Результат: 10
.
Основываясь на documentation, мне не ясно, если это действительно так, чтобы использовать местные вары в Clojure, как указано выше, но я бы подозревал, что ответ отрицательный. Можете ли вы подтвердить это (или опровергнуть и объяснить, что я делаю неправильно в первом примере)? И если мое предположение ясно (т. Е. Что локальные вары не могут быть использованы в закрытии), то объясните, в чем причина этого?
EDIT: для записей, this is the problem I was trying to solve.
Спасибо за быстрый ответ, это, кажется, действительно правильный способ использования локальных переменных в закрытие. Приятно узнать что-то новое :) К несчастью, хотя это не решает мою оригинальную проблему, так как кажется, что значение локальной переменной «сбрасывается» с каждым вызовом возвращаемой функции (см. Также связанный с ним вопрос CodeReview в EDIT для деталей). – Attilio
@Attilio - Мне непонятно, каково ваше ожидаемое поведение (в вашем другом вопросе). Что делать, если вы просто замените 'with-local-vars' в определении' logfun' на '(пусть [depth (atom 0)] ...)' вместо? Это приводит к поведению, которое вы ищете? Если нет, вы можете попытаться переместить 'let' * вне *' defn logfun' (что позволит 'logfun' закрываться над' depth', не делая его глобальным определением). – DaoWen