Emacs Lisp предоставляет богатый набор типов данных. Некоторые из них, такие как ячейки cons, целые числа и строки, являются общими для почти всех диалектов Lisp. Другие, такие как маркеры и буферы, довольно специфичны и необходимы для обеспечения базовой поддержки написания команд редактора на Lisp. Для реализации такого разнообразия типов объектов и предоставления эффективного способа передачи объектов между подсистемами интерпретатора существует набор структур данных C и специальный тип для представления указателей на все них, который известен как тегированный указатель.
В C тегированный указатель — это объект типа Lisp_Object. Любая инициализированная переменная такого типа всегда содержит значение одного из следующих базовых типов данных: целое число, символ, строка, ячейка cons, число с плавающей запятой или объект типа vector-like. Каждый из этих типов данных имеет соответствующее значение тега. Все теги перечисляются в enum Lisp_Type и помещаются в 3-битное поле Lisp_Object. Остальные биты — это само значение. Целые числа являются непосредственными, то есть напрямую представлены этими битами значения, а все остальные объекты представлены указателями C на соответствующий объект, выделенный из кучи. Ширина Lisp_Object зависит от платформы и конфигурации: обычно она равна ширине базового указателя платформы (т.е. 32 бита на 32-битной машине и 64 бита на 64-битной), но также существует специальная конфигурация, где Lisp_Object имеет размер 64 бита, но все указатели имеют размер 32 бита. Этот последний трюк был разработан для преодоления ограниченного диапазона значений для целых чисел Lisp в 32-битной системе путем использования типа long long размером 64 бита для Lisp_Object.
Следующие структуры данных C определены в lisp.h для представления базовых типов данных, помимо целых чисел:
struct Lisp_ConsЯчейка cons, объект, используемый для построения списков.
struct Lisp_StringСтрока, базовый объект для представления последовательности символов.
struct Lisp_VectorМассив, фиксированный набор объектов Lisp, доступ к которым осуществляется по индексу.
struct Lisp_SymbolСимвол, сущность с уникальным именем, часто используемая в качестве идентификатора.
struct Lisp_FloatЧисло с плавающей запятой.
Эти типы являются гражданами первого класса внутренней системы типов. Поскольку пространство тегов ограничено, все остальные типы являются подтипами Lisp_Vectorlike. Подтипы vector enumerруются в enum pvec_type, и почти все сложные объекты, такие как окна, буферы, фреймы и процессы, относятся к этой категории.
Ниже приведено описание нескольких подтипов Lisp_Vectorlike. Объект буфера представляет текст для отображения и редактирования. Окно — это часть структуры отображения, которая показывает буфер или используется в качестве контейнера для рекурсивного размещения других окон на том же фрейме. (Не путайте объект окна Emacs Lisp с окном как сущностью, управляемой системой пользовательского интерфейса, такой как X; в терминологии Emacs последнее называется фреймом.) Наконец, объект процесса используется для управления подпроцессами.