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.

Для представления базовых типов данных, кроме целых чисел, в 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

Spec-Zone.ru

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