Некоторые списки, представляющие типы, с помощью символов могут быть
более специализированы. Такие подробности могут быть отражены, как более
эффективная реализация. Например, предположим что (array short-float).
Реализация A, может выбрать специализированное представление для
массива коротких с плавающей точкой, а реализация B может выбрать более
общее представление.
Если вы хотите создать массив в целях хранения только коротких с
плавающей точкой, вы можете опционально указать для make-array тип
элементов short-float. Это не потребует от make-array создать
объект типа (array short-float), но это просто позволит ей выбрать
родственный тип. Запрос можно объяснить так: «Предоставь наиболее
специализированный массив, который может хранить короткие с плавающей
точкой, который только может предоставить реализация». Реализация A
тогда предоставит специализированный массив типа (array short-float), а
реализация B — простой массив типа (array t).
На вопрос, действительно ли тип созданного массива (array short-float),
реализация A ответит «да», но реализация B ответит «нет». Это свойство
make-array и подобных ей функций: то, что вы просите, необязательно
является тем, что вы получите.
Далее перечислены возможные имена типов, которые задаются
списком:
-
(array element-type size)
Такая запись обозначает множество
специализированных массивов, элементы которых принадлежат типу
element-type и размер которых равен size. element-type должен быть
корректным спецификатором типа или не уточнён с помощью
*. size может быть неотрицательным целым, определяющим
размер массива, может быть списком неотрицательных целых,
определяющих размер каждого измерения (размер какого-либо
измерения может быть не указан, *) или может быть не указан *.
Например,
(array integer 3) ;Трёхэлементный массив целых
(array integer (* * *)) ;Трёхмерный массив целых
(array * (4 5 6)) ;Трёхмерный массив, размеры измерений 4,5,6
(array character (3 *)) ;Двумерный массив символов
; у которого только три строки
(array short-float ()) ;Ранг массива равен нулю, массив содержит
; короткие с плавающие точкой
Следует отметить, что (array t) является правильным подмножеством
(array *). Причиной тому является то. что (array t) это множество
массивов, которые могут содержать любой Common Lisp объект
(элементы типа t, которые включают все элементы). С другой стороны,
(array *) является множеством всех массивов, включая, например,
массивы, которые могут хранить только строковые символы. Сейчас
(array character) не является подмножеством (array t); два
множества фактически непересекаются, потому что (array character)
не является множеством всех массивов, которые могут хранить буквы, а
является множеством массивов, которые специализированы хранить
именно символы и никакие другие объекты FIXME. Поэтому
проверка, может ли массив foo хранить буквы, не может быть такой:
(typep foo ’(array character))
, а должна быть такой:
(subtypep ’character (array-element-type foo))
Смотрите array-element-type.
-
(simple-array element-type sizes)
Данная запись эквивалентна (array
element-type sizes) за исключением того, что дополнительно
определяет, что объекты будут простыми массивами (смотрите
раздел 2.5).
-
(vector element-type size)
Такой тип обозначает множество
специализированный одномерных массивов, все элементы которых
принадлежат типу element-type и size которого равен size. Такой тип
полностью эквивалентен (array element-type (size)). Например:
(vector double-float) ;Векторы двойных
; чисел с плавающей точкой
(vector * 5) ;Векторы длинной пять элементов
(vector t 5) ;Общие векторы длинной пять элементов FIXME
(vector (mod 32) *) ;Вектора целых чисел между 0 и 31
Тип string является объединение одно или более специализированных
типов векторов, а именно всех векторов, тип элементов которых
является подтипом character.
-
(simple-vector size)
Такая запись означает то же, что и (vector t
size).
-
(complex type)
Каждый элемент такого типа является комплексным
числом, у которого действительная и мнимая части принадлежат типу
type. For declaration purposes, this type encompasses those complex
numbers that can result by giving numbers of the specified type to the
function complex; this may be different from what the type means for
discrimination purposes. As an example, Gaussian integers might be
described as (complex integer), even in implementations where giving two
integers to the function complex results in an object of type (complex
rational).
-
(function (argument-type-1 argument-type-2 ...) value-type)
Этот тип
может использоваться только для декларации и не может для
распознавания; typep будет сигнализировать ошибку, если ей
будет передан такой спецификатор типа. Каждый элемент такого
типа является функцией, которая принимает аргументы типов
перечисленных с помощью форм argument-type-j и возвращает значение
типа value-type. В форме типов аргументов могут использоваться
маркеры &optional, &rest и &key. value-type может быть
спецификатором типа values в случае, если функция возвращает
несколько значений.
-
(values value-type-1 value-type-2 ...)
Данный тип используется только в
двух случаях: только как value-type для спецификатора типа функции
и в операторе the. Данный спецификатор используется для
задания типов в случаях возврата нескольких значений. В списке
с типами могут использоваться маркеры &optional, &rest и
&key.