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
(1 2 3))
'(((a b c) (3 1 2))
((d e f) (2 3 1))
((g h i) (0 0 0)))) ((j k l) (
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
3) => "aaa" :fill-pointer
下記は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
(5))
:fill-pointer => #<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
ではない配列を作成する特定の方法はありません。