Внутреннее устройство объектов
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.
Следующие C-структуры данных определены в lisp.h для представления основных типов данных, помимо целых чисел:
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-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Object-Internals.html