% Function MAKE-ARRAY
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
ではない配列を作成する特定の方法はありません。