Function MAKE-ARRAY
make-array dimensions &key element-type initial-element initial-contents adjustable fill-pointer displaced-to displaced-index-offset
=> new-array
dimensions - 有効な配列の大きさのリストの指定子
element-type - 型指定子。デフォルトはt。
initial-element - オブジェクト
initial-contents - オブジェクト
adjustable - generalized-boolean。デフォルトはnil。
fill-pointer - 作成される配列の有効なfill-pointerか、 tか、nil。 デフォルトはnil。
displaced-to - 配列か、nil。 デフォルトはnil。 もしinitial-elementかinitial-contentsが指定されたら、 このオプションは指定できません。
displaced-index-offset - displaced-toの有効な配列のrow-majorインデックス。 デフォルトは0。 もしdisplaced-toにnilが指定されたら、 このオプションは指定できません。
new-array - 配列
element-typeによって与えられた要素の型を収容できるような、 特定化した型によって構築された配列を生成して返却します。 もしdimensionがnilのときは、 ゼロ次元の配列を生成します。
dimensionは新しい配列の次元の表現です。
element-typeはnew-arrayが格納できる要素の型を示します。 new-arrayは実際にはelement-typeをアップグレードした結果の 型のオブジェクトを格納します。 15.1.2.1. 配列のアップグレードをご確認ください。
もしinitial-elementが指定されたとき、 それはnew-arrayの各要素の初期値として使用されます。 もしinitial-elementが指定されたら、 それは指定されたelement-typeの型でなければなりません。 もし:initial-contentsが指定されたか、 displaced-toがnilではないかの どちらかのときにinitial-elementは指定できません。 もしinitial-elementが指定されず、 さらにinitial-contentsが指定されず displaced-toがnilのときは、 new-arrayの初期化されなかった要素が 後で読み込まれたときの結果は未定義です。
initial-contentsは配列の内容を初期化するときに使用します。 例えば次の通り。
(make-array '(4 2 3) :initial-contents
'(((a b c) (1 2 3))
((d e f) (3 1 2))
((g h i) (2 3 1))
((j k l) (0 0 0))))initial-contentsはシーケンスの構造をネストして構築されます。 その構造の階層の数は、配列のランクと等しくなければなりません。 ネストされた構造の各葉の部分は、 与えられたelement-typeの型でなければなりません。 もし配列がゼロ次元のとき、initial-contentsはひとつの要素を指定します。 その他の場合は、initial-contentsは最初の次元と 等しい長さのシーケンスでなければなりません。 そのシーケンスの各要素は、残りの次元の配列に対する ネストされた構造でなければならず、以下同様です。 もし:initial-elementが指定されたか、 displaced-toがnilではないかの どちらかのときにinitial-contentsは指定できません。 もしinitial-contentsが指定されず、 さらにinitial-elementが指定されず displaced-toがnilのときは、 new-arrayの初期化されなかった要素が 後で読み込まれたときの結果は未定義です。
もしadjustableがnilではないとき、 配列はadjustableと表現されます(また、実際にadjustableです)。 その他の場合は、配列はadjustableと表現されません (また、配列が実際にadjustableかどうかは実装依存です)。
もしfill-pointerがnilではないとき、 配列は一次元で無ければならず、つまり配列はvectorでなければなりません。 もしfill-pointerがtのとき、 vectorの長さがfill-pointerの初期化に使用されます。 もしfill-pointerが整数のとき、 それがvectorのfill-pointerの初期値になります。
もしdisplaced-toがnilではないとき、 make-arrayはdisplaced-toをdisplacedの配列の参照先とした displaced配列を作成します。 このような場合、displaced-toの実際の配列の要素の型と、 作成される配列の実際の配列の要素の型が 型として等しくなかったときの結果は未定義です。 もしdisplaced-toがnilのとき、 配列はdisplacedの配列ではありません。
displaced-index-offsetは、配列のオフセットのインデックスになります。 配列Aがmake-arrayの引数:displaced-toとして与えられ、 配列Bが生成されたとき、 配列Bは配列Aへdisplacedしていると言われます。 その配列のすべての要素数を、配列の全サイズと呼びますが、 それは全ての次元の積として計算されます。 Aの全サイズは、 Bの全サイズにdisplaced-index-offsetとして指定された オフセットnを加えた合計よりも小さくてはいけません。 displacedの効果は、 配列Bは自分自身では何の要素も持たず、 しかしかわりに自分自身のアクセスが配列Aへのアクセスに対応します。 この対応はそれらの両方に対して row-majorオーダーの要素を取るような一次元の配列として扱われ、 配列Bの要素kへのアクセスが、 配列Aの要素k+nへのアクセスに対応されます。
もしmake-arrayが、adjustable, fill-pointer, displaced-to それぞれnilとして呼び出されたとき、 その結果はsimple-arrayになります。 もしmake-arrayが、adjustable, fill-pointer, displaced-to のうちのどれかひとつ以上がtrueのとき、 結果の配列がsimple-arrayかどうかは実装依存です。
(make-array 5) ;; 一次元で5つの要素の配列を作成
(make-array '(3 4) :element-type '(mod 16))
;; 二次元3,4の各要素4bitの配列を作成
(make-array 5 :element-type 'single-float) ;; single-floatの配列を作成
(make-array nil :initial-element nil) => #0ANIL
(make-array 4 :initial-element nil) => #(NIL NIL NIL NIL)
(make-array '(2 4)
:element-type '(unsigned-byte 2)
:initial-contents '((0 1 2 3) (3 2 1 0)))
=> #2A((0 1 2 3) (3 2 1 0))
(make-array 6
:element-type 'character
:initial-element #\a
:fill-pointer 3) => "aaa"下記はdisplaced配列の作成の例です。
(setq a (make-array '(4 3)))
=> #<ARRAY 4x3 simple 32546632>
(dotimes (i 4)
(dotimes (j 3)
(setf (aref a i j) (list i 'x j '= (* i j)))))
=> NIL
(setq b (make-array 8 :displaced-to a
:displaced-index-offset 2))
=> #<ARRAY 8 indirect 32550757>
(dotimes (i 8)
(print (list i (aref b i))))
>> (0 (0 X 2 = 0))
>> (1 (1 X 0 = 0))
>> (2 (1 X 1 = 1))
>> (3 (1 X 2 = 2))
>> (4 (2 X 0 = 0))
>> (5 (2 X 1 = 2))
>> (6 (2 X 2 = 4))
>> (7 (3 X 0 = 0))
=> NIL最後の例は配列がrow-majorオーダーで格納する効果に依存しています。
(setq a1 (make-array 50))
=> #<ARRAY 50 simple 32562043>
(setq b1 (make-array 20 :displaced-to a1 :displaced-index-offset 10))
=> #<ARRAY 20 indirect 32563346>
(length b1) => 20
(setq a2 (make-array 50 :fill-pointer 10))
=> #<ARRAY 50 fill-pointer 10 46100216>
(setq b2 (make-array 20 :displaced-to a2 :displaced-index-offset 10))
=> #<ARRAY 20 indirect 46104010>
(length a2) => 10
(length b2) => 20
(setq a3 (make-array 50 :fill-pointer 10))
=> #<ARRAY 50 fill-pointer 10 46105663>
(setq b3 (make-array 20 :displaced-to a3 :displaced-index-offset 10
:fill-pointer 5))
=> #<ARRAY 20 indirect, fill-pointer 5 46107432>
(length a3) => 10
(length b3) => 5なし。
なし。
adjustable-array-p, aref, arrayp, array-element-type, array-rank-limit, array-dimension-limit, fill-pointer, upgraded-array-element-type
adjustable-array-pが絶対にfalseを返却するような 配列を作成する特定の方法はありません。 simple-arrayではない配列を作成する特定の方法はありません。