Подтвердить что ты не робот

Когда Emacs Lisp лексически-позволяет утечка памяти?

Я читал о lexical-let утечке памяти, например здесь: Есть ли проблемы с лексико-let или другими cl-макросами??? - Список пользователей для текстового редактора GNU Emacs - ArchiveOrange

В нем говорится:

"Обратите внимание, что переменные, связанные с лексико-let, никогда не выпускаются, даже если они никогда не используются. Попробуйте

(loop for i from 1 to 100000 collect (lexical-let ((x i)) '()))

и наблюдайте, как он ел память.

Но я думаю, что этот код ест память только потому, что список, созданный циклом, растет. Итак, я написал несколько кодов elisp, чтобы проверить, когда это произойдет, но я не смог найти пример утечки.

Это то, как память растет со временем, когда я выполняю код ниже.

lambda-in-let.el

(require 'cl)

(defvar num-loop-1 30)
(defvar num-loop-2 100000)

(loop for i from 1 to num-loop-1 do
      (loop for j from 1 to num-loop-2 collect
            (lexical-let ((x `(,i ,j))) (lambda () x))))

Похоже, утечки нет.

Подробнее здесь: https://gist.github.com/1703325

ДОБАВЛЕНО: так выглядит первый пример памяти. Как я уже сказал, я думаю, что это артефакт.

lambda-in-let.el

4b9b3361

Ответ 1

Я только что нашел это в emacs-devel:

Когда используется emacs Lisp для лексики-утечки памяти?  Итак... Это правда, что "переменные, связанные с лексико-let, никогда   выпущены, даже если они никогда не используются"?

Не знаю, что знаю. Конечно, этот код не является ошибкой, но я не знаю любого конкретного случая, который сталкивается с такой ошибкой.

- Re: lexical-let вызывает утечку памяти?