Тип спецификатор — это выражение, обозначающее тип. Тип представляет собой набор возможных значений. Типы спецификаторов можно классифицировать на примитивные и составные типы.
Типы спецификаторов используются для нескольких целей, включая: документирование интерфейсов функций с помощью деклараций (см. Форма declare), указание типов слотов структуры (см. Структуры в Расширения Common Lisp для GNU Emacs Lisp)), выполнение проверок типов с помощью cl-the (см. Декларации в Расширения Common Lisp для GNU Emacs Lisp)), а также помощь нативному компилятору (см. Компиляция Lisp в нативный код) в оптимизации генерации кода и выводе сигнатур функций.
Примитивные типы спецификаторы — это базовые типы (т.е. не составленные другими типами спецификаторами).
Встроенные примитивные типы (такие как integer, float, string и т. д.) перечислены в Иерархия типов объектов Emacs Lisp.
Составные типы служат для определения более сложных или точных спецификаций типов путем объединения или модификации более простых типов.
Список составных типов спецификаторов:
(or type-1 … type-n)Тип спецификатор or описывает тип, который удовлетворяет хотя бы одному из заданных типов.
(and type-1 … type-n)Аналогично, тип спецификатор and описывает тип, который удовлетворяет всем заданным типам.
(not type)Тип спецификатор not определяет любой тип, кроме указанного.
(member value-1 … value-n)Тип спецификатор member позволяет указать тип, который включает только явно перечисленные значения.
(function (arg-1-type … arg-n-type) return-type)Тип спецификатор function используется для описания типов аргументов и типа возвращаемого значения функции. Типы аргументов могут чередоваться с символами &optional и &rest, чтобы соответствовать аргументам функции (см. Возможности списков аргументов).
Следующий тип спецификатор представляет функцию, чей первый параметр имеет тип symbol, второй необязательный параметр имеет тип float, а возвращаемое значение — integer:
(function (symbol &optional float) integer)
(integer lower-bound upper-bound)Тип спецификатор integer также может использоваться как составной тип спецификатор для определения подмножества целочисленных значений путем указания диапазона. Это позволяет точно контролировать, какие целые числа допустимы для данного типа.
lower-bound — это минимальное целочисленное значение в диапазоне, а upper-bound — максимальное. Вы можете использовать * вместо нижней или верхней границы, чтобы указать отсутствие ограничений.
Следующее представляет все целые числа от -10 до 10:
(integer -10 10)
Следующее представляет единственное значение 10:
(integer 10 10)
Следующее представляет все целые числа от минус бесконечности до 10:
(integer * 10)