"Сборка мусора" - повторное распределение памяти
Самым интересным, можно сказать революционным, механизмом работы с памятью в Лиспе бесспорно явилась "сборка мусора". С начала 60-ых годов методам такой работы посвящены многочисленные исследования, продолжающиеся до наших дней и сильно активизировавшиеся в связи с включением похожего механизма в реализацию языка Java.
Общая идея всех таких методов достаточно проста:
- пока памяти хватает, о ней можно не беспокоиться и располагать новые данные в новых блоках памяти,
- если памяти вдруг не оказалось, то надо выполнить "сборку мусора", при которой можно найти блоки, ставшие бесполезными для программы,
- если память нашлась, ее снова можно беззаботно тратить.
Специальная программа "сборка мусора" выполняет анализ достижимости всех блоков памяти просто пометкой узлов, видимых из конечного числа рабочих регистров системы программирования. К таким регистрам относятся промежуточные результаты вычислений, активная часть стека, ассоциативный список, таблица атомов и др. После пометки все непомеченные узлы объединяются в список свободной памяти, передающий их для повторного использования новым вызовам функции CONS. Такая автоматизация не лишена недостатков, но они обнаруживаются лишь в сравнительно сложных процессах, требования которых мы сейчас сознательно не рассматриваем.
| (Gensym ) | Создает новый уникальный атом |
| (Get Атом Индикатор) | Выдает адрес свойства Атома, помеченного заданным Индикатором. |
| (Set Форма Данное ) | Устанавливает значение переменной, одноименной с атомом, полученным при вычислении Формы. |
| Setf | |
| (Setq Атом Данное ) | Устанавливает значение Атома-переменной |
| Symbol-function | |
| Symbol-plist | |
| Symbol-value | |
| Remprop | |
| (Nconc Список … ) | Сцепляет списки без копирования, т.е. заменяя последний Nil очередного списка на указатель следующего списка. |
| (Rplaca Пара Объект ) | Заменяет левый элемент Пары на Объект. |
| (Rplacd Пара Объект ) | Заменяет правый элемент Пары на Объект. |