Emacs Lisp использует два типа хранения для объектов Lisp, созданных пользователем: обычное хранилище и чистое хранилище. Обычное хранилище используется для хранения всех новых данных, созданных во время сеанса Emacs (см. Сборка мусора). Чистое хранилище используется для определенных данных в предварительно загруженных стандартных файлах Lisp — данных, которые никогда не должны меняться во время фактического использования Emacs.
Чистое хранилище выделяется только во время загрузки
стандартных предварительно загруженных библиотек Lisp командой temacs. В файле emacs оно
помечается как только для чтения (в операционных системах, которые это позволяют), чтобы пространство памяти можно было совместно использовать всеми запущенными процессами Emacs на
машине одновременно. Чистое хранилище не расширяется; фиксированный объем выделяется при компиляции Emacs, и если этого недостаточно для
предварительно загруженных библиотек, temacs выделяет динамическую память для той части, которая не поместилась. Если Emacs будет выгружен с использованием метода
pdump (см. Сборка Emacs), переполнение чистого пространства не имеет особой важности (это просто означает, что часть предварительно загруженных данных
не может быть разделена с другими процессами Emacs). Однако, если Emacs будет выгружен с использованием теперь устаревшего метода unexec, полученный
образ будет работать, но сборка мусора (см. Сборка мусора) будет отключена в этой ситуации, что приведет к утечке памяти. Подобное
переполнение обычно не происходит, если вы не пытаетесь предварительно загрузить дополнительные библиотеки или добавить функции к стандартным. Emacs отобразит
предупреждение о переполнении при запуске, если он был выгружен с использованием
unexec. Если это произойдет, вам следует увеличить параметр компиляции SYSTEM_PURESIZE_EXTRA в файле
src/puresize.h и пересобрать Emacs.
Эта функция создает копию в чистом хранилище object и возвращает ее. Она копирует строку, просто создавая новую строку с теми же символами, но без свойств текста, в чистом хранилище. Она рекурсивно копирует содержимое векторов и ячеек cons. Она не создает копий других объектов, таких как символы, а просто возвращает их без изменений. Она сигнализирует об ошибке, если запрашивается копирование маркеров.
Эта функция не выполняет никаких действий, кроме как во время сборки и выгрузки Emacs; она обычно вызывается только в предварительно загруженных файлах Lisp.
Значение этой переменной — это количество байтов чистого хранилища, выделенных на данный момент. Обычно в выгруженном Emacs это число очень близко к общему объему доступного чистого хранилища — иначе мы бы выделяли меньше.
Эта переменная определяет, должен ли defun создавать копию определения функции в чистом хранилище. Если она не равна nil, то определение функции копируется в чистое хранилище.
Этот флаг равен t во время первоначальной загрузки всех базовых функций для сборки Emacs (что позволяет этим функциям быть совместно используемыми и не подлежащими сборке). Выгрузка Emacs как исполняемого файла всегда записывает
nil в эту переменную, независимо от того, какое значение она имеет до и после выгрузки.
Вы не должны изменять этот флаг в запущенном Emacs.