Внутреннее устройство объектов
Emacs Lisp предоставляет богатый набор типов данных. Некоторые из них, например cons-ячейки, целые числа и строки, распространены почти во всех диалектах Lisp. Другие, например маркеры и буферы, довольно специфичны и необходимы для базовой поддержки написания команд редактора на Lisp. Для реализации такого разнообразия типов объектов и эффективной передачи объектов между подсистемами интерпретатора существует набор структур данных C и специальный тип для представления указателей на все эти структуры, известный как тегированный указатель.
В C тегированный указатель — это объект типа Lisp_Object. Любая инициализированная переменная такого типа всегда содержит значение одного из следующих базовых типов данных: целое число, символ, строка, cons-ячейка, число с плавающей точкой или вектороподобный объект. Каждому из этих типов данных соответствует значение тега. Все теги перечислены в enum Lisp_Type и помещены в 3-битовое битовое поле Lisp_Object. Остальные биты содержат само значение. Целые числа являются непосредственными, то есть представлены напрямую этими битами значения, а все остальные объекты представлены указателями C на соответствующий объект, выделенный в куче. Разрядность Lisp_Object зависит от платформы и конфигурации: обычно она равна разрядности указателя базовой платформы (то есть 32 бита на 32-битной машине и 64 бита на 64-битной), но существует также специальная конфигурация, в которой Lisp_Object имеет разрядность 64 бита, а все указатели — 32 бита. Этот приём был разработан, чтобы преодолеть ограниченный диапазон значений целых чисел Lisp в 32-битной системе, используя 64-битный тип long long для Lisp_Object.
Для представления базовых типов данных, кроме целых чисел, в lisp.h определены следующие структуры данных C:
struct Lisp_Cons-
Cons-ячейка — объект, используемый для построения списков.
struct Lisp_String-
Строка — базовый объект для представления последовательности символов.
struct Lisp_Vector-
Массив — набор объектов Lisp фиксированного размера, к которым можно обращаться по индексу.
struct Lisp_Symbol-
Символ — сущность с уникальным именем, обычно используемая в качестве идентификатора.
struct Lisp_FloatЧисло с плавающей точкой.
Эти типы являются основными типами внутренней системы типов. Поскольку пространство тегов ограничено, все остальные типы являются подтипами Lisp_Vectorlike. Подтипы векторов перечислены в enum pvec_type, и почти все сложные объекты, такие как окна, буферы, кадры и процессы, относятся к этой категории.
Ниже описаны несколько подтипов Lisp_Vectorlike. Объект буфера представляет текст для отображения и редактирования. Окно — часть структуры отображения, которая показывает буфер или служит контейнером для рекурсивного размещения других окон в том же кадре. (Не путайте объект окна Emacs Lisp с окном как сущностью, управляемой системой пользовательского интерфейса, например X; в терминологии Emacs последнее называется кадром.) Наконец, объект процесса используется для управления подпроцессами.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Object-Internals.html