4.2 Списки как спецификаторы типов

Если типа задаётся списком, car элемент данного списка является символом, и остаток списка — вспомогательной информацией. В большинстве случаев вспомогательная информация может быть неопределена. Неопределённая дополнительная информация указывается с помощью *. Например, для полного описания векторного типа, должны быть указаны тип элементов и их количество:

(vector double-float 100)

Для указания неопределённой длины, можно записать:

(vector double-float *)

Для указания неопределённого типа элемента, можно записать:

(vector * 100)

Можно также оставить неопределёнными и тип элемента, и длину:

(vector * *)

Допустим, что два спецификатора являются одинаковыми за исключением того, что первый содержит *, а второй содержит конкретное значение. Тогда второй тип является подтипом первого типа.


Таблица 4.1: Стандартные символы для обозначения типов

array  fixnum  package  simple-string
atom  float  pathname  simple-vector
bignum  function  random-state  single-float
bit  hash-table ratio  standard-char
bit-vector   integer   rational   stream
character  keyword  readtable  string
 list  sequence  
compiled-function long-float  short-float  symbol
complex  nil  signed-byte  t
cons  null  simple-array  unsigned-byte
double-float  number  simple-bit-vector vector

Для удобства существует следующее правило: если список в конце содержит незаданные элементы (*), то они могут быть опущены. Если все, за исключением первого, элементы не специфицированы, то данный список может быть упрощён вплоть до упразднения скобок и превращения его в простой символ, который был в car. Например, (vector * *) может быть записан как (vector), а затем как vector.