Я смотрел на источник для memoize
. Исходя из таких языков, как C++/Python, эта часть ударила меня трудно: (let [mem (atom {})] (fn [& args] (if-let [e (find @mem args)] ...
Когда clojure удаляет переменную?
Я понимаю, что memoize
возвращает функцию, но и для хранения состояния, он использует локальный «переменный» mem
. Но послеmemoize
возвращает функцию, не следует, чтобы внешняя версия исчезла из области видимости. Как функция может по-прежнему ссылаться на mem
.
Почему Clojure не удаляет эту внешнюю переменную и как она управляет именами переменных. Например, я делаю еще одну memoized функцию, тогда memoize
использует другой mem
. Разве это имя не столкнулось с более ранним mem
?
P.S .: Я думал, что там должно быть что-то много, происходит там, что мешает, так что я написал себе более легкий вариант, который идет как http://ideone.com/VZLsJp, но до сих пор работает как memoize
.
@Flimzy, спасибо за оценку: D –