Spec-Zone.ru › Elisp

Внутреннее устройство объектов

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API