Не волнуйтесь о большом количестве опций для функции make-array. Все что действительно необходимо, это список размерностей. Остальные же опции служат для относительно эзотерических программ.
[Функция]
make-array dimensions &key :element-type :initial-element :initial-contents :adjustable :fill-pointer :displaced-to :displaced-index-offsetЭто базовая функция для создания массивов. Аргумент dimensions должен быть списком неотрицательных целых чисел, которые являются измерениями массива. Длина списка является размерностью массива. Каждое измерение должно быть меньше чем array-dimension-limit, и произведение всех измерений должно быть меньше array-total-size-limit. Следует отметить, что если dimensions nil, тогда создаётся массив с нулевым количеством измерений. По соглашению, при создании одномерного массива, размер измерений может быть указан как одиночное целое число, а не список целых чисел.
Реализация Common Lisp’а может иметь ограничение на ранг массива, но это ограничение должно быть меньше 7. Таким образом, любая Common Lisp программа может использовать массивы с рангом меньшим или равным 7.
Для make-array существуют следующие именованные параметры:
X3J13 voted in January 1989 to change typep and subtypep so that the specialized array type specifier means the same thing for discrimination purposes as for declaration purposes: it encompasses those arrays that can result by specifying element-type as the element type to the function make-array. Therefore we may say that if type is the :element-type argument, then the result will be an array of type (array type); put another way, for any type A,
is always true. See upgraded-array-element-type.
Количество уровней в структуре должно равняться рангу массива. Каждый лист вложенной структуры должен иметь тип, указанный в опции :type. Если опция :initial-contents опущена, первоначальное значение элементов массива не определено (если только не используется опция :initial-element или :displaced-to). Опция :initial-contents может не использоваться, когда указана опция :initial-element или :displaced-to.
X3J13 voted in June 1989 to clarify that if this argument is non-nil then the predicate adjustable-array-p will necessarily be true when applied to the resulting array; but if this argument is nil (or omitted) then the resulting array may or may not be adjustable, depending on the implementation, and therefore adjustable-array-p may be correspondingly true or false of the resulting array. Common Lisp provides no portable way to create a non-adjustable array, that is, an array for which adjustable-array-p is guaranteed to be false.
Если при создании массива B массив A передан в качестве аргумента :displaced-to в функцию make-array, тогда массив B называется соединённым с массивом A. Полное количество элементов массива, называемое полный размер массива, вычисляется как произведение размеров всех измерений (смотрите array-total-size). Необходимо, чтобы полный размер массива A был не меньше чем сумма полного размера массива B и смещения n, указанного в аргументе :displaced-index-offset. Смысл соединения массивов в том, что массив B не имеет своих элементов и операции над ним приводят в действительности к операциям над массивом A. При отображении элементов массивов, последние рассматриваются как одномерные, с построчным порядком размещения элементов. Так, элемент с индексом k массива B отображается в элемент с индексом k+n массива A.
Если make-array вызывается без указания аргументов :adjustable, :fill-pointer и :displaced-to, или указания их в nil, тогда получаемый массив гарантированного будет простым (смотрите раздел 2.5).
X3J13 voted in June 1989 to clarify that if one or more of the :adjustable, :fill-pointer, and :displaced-to arguments is true, then whether the resulting array is simple is unspecified.
Вот несколько примеров использования make-array:
Последний пример связи между массивами зависит от того факта, что элементы массивов хранятся построчно. Другими словами, индексы элментов массива упорядочены лексикографически.
Значение array-rank-limit является положительным целым, которое обозначает (невключительно) наивысший возможный ранг массива. Это значение зависит от реализации, но не может быть меньше 8. Таком образом каждая реализация Common Lisp’а поддерживает массивы, ранг которых лежит между 0 и 7 (включительно). (Разработчикам предлагается сделать это значение большим настолько, на сколько это возможно без ущерба в производительности.)
Значение array-dimension-limit является положительным целым, которое обозначает (невключительно) наивысший возможный размер измерения для массива. Это значение зависит от реализации, но не может быть меньше 1024. (Разработчикам предлагается сделать это значение большим настолько, на сколько это возможно без ущерба в производительности.)
X3J13 voted in January 1989 to specify that the value of array-dimension-limit must be of type fixnum. This in turn implies that all valid array indices will be fixnums.
Значение array-total-size-limit является положительным целым, которое обозначает (невключительно) наивысшее возможное количество элементов в массиве. Это значение зависит от реализации, но не может быть меньше 1024. (Разработчикам предлагается сделать это значение большим настолько, на сколько это возможно без ущерба в производительности.)
На практике предельный размер массива может зависеть от типа элемента массива, в таком случае array-total-size-limit будет наименьшим из ряда этих размеров.
Функция vector служит для создания простых базовых векторов с заданным содержимым. Она является аналогом для функции list.