Обратите внимание, что аргумент :ELEMENT-TYPE
для MAKE-ARRAY
делает что-то особенное, и его точное поведение может быть немного удивительным.
Используя его, вы говорите Common Lisp, что ARRAY должен иметь возможность хранить элементы этого типа элемента или некоторых его подтипов.
Затем система Common Lisp вернет массив, который может хранить эти элементы. Это может быть специализированный массив или массив, который также может хранить более общие элементы.
Примечание: это не объявление типа, и оно не обязательно будет проверено во время компиляции или во время выполнения.
Функция UPGRADED-ARRAY-ELEMENT-TYPE
сообщает вам, до какого элемента массив может быть обновлен.
LispWorks 64bit:
CL-USER 10 > (upgraded-array-element-type '(unsigned-byte 8))
(UNSIGNED-BYTE 8)
CL-USER 11 > (upgraded-array-element-type '(unsigned-byte 4))
(UNSIGNED-BYTE 4)
CL-USER 12 > (upgraded-array-element-type '(unsigned-byte 12))
(UNSIGNED-BYTE 16)
Итак, Lispworks 64bit имеет специальные массивы для 4- и 8-битных элементов. Для 12-битных элементов выделяется массив, который может хранить до 16-битных элементов.
Мы генерируем массив, который может хранить десять чисел длиной до 12 бит:
CL-USER 13 > (make-array 10
:element-type '(unsigned-byte 12)
:initial-element 0)
#(0 0 0 0 0 0 0 0 0 0)
Давайте проверим его тип:
CL-USER 14 > (type-of *)
(SIMPLE-ARRAY (UNSIGNED-BYTE 16) (10))
Это простой массив (не настраиваемый, без указателя заполнения).
Он может хранить элементы типа (UNSIGNED-BYTE 16)
и его подтипы.
Длина 10 и одно измерение.