Function MAKE-ARRAY

UP


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-elementinitial-contentsが指定されたら、 このオプションは指定できません。
displaced-index-offset - displaced-toの有効な配列のrow-majorインデックス。 デフォルトは0。 もしdisplaced-tonilが指定されたら、 このオプションは指定できません。
new-array - 配列

定義

element-typeによって与えられた要素の型を収容できるような、 特定化した型によって構築された配列を生成して返却します。 もしdimensionnilのときは、 ゼロ次元の配列を生成します。

dimensionは新しい配列の次元の表現です。

element-typenew-arrayが格納できる要素の型を示します。 new-arrayは実際にはelement-typeをアップグレードした結果の 型のオブジェクトを格納します。 15.1.2.1. 配列のアップグレードをご確認ください。

もしinitial-elementが指定されたとき、 それはnew-arrayの各要素の初期値として使用されます。 もしinitial-elementが指定されたら、 それは指定されたelement-typeの型でなければなりません。 もし:initial-contentsが指定されたか、 displaced-tonilではないかの どちらかのときにinitial-elementは指定できません。 もしinitial-elementが指定されず、 さらにinitial-contentsが指定されず displaced-tonilのときは、 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-tonilではないかの どちらかのときにinitial-contentsは指定できません。 もしinitial-contentsが指定されず、 さらにinitial-elementが指定されず displaced-tonilのときは、 new-arrayの初期化されなかった要素が 後で読み込まれたときの結果は未定義です。

もしadjustablenilではないとき、 配列はadjustableと表現されます(また、実際にadjustableです)。 その他の場合は、配列はadjustableと表現されません (また、配列が実際にadjustableかどうかは実装依存です)。

もしfill-pointernilではないとき、 配列は一次元で無ければならず、つまり配列はvectorでなければなりません。 もしfill-pointertのとき、 vectorの長さがfill-pointerの初期化に使用されます。 もしfill-pointerが整数のとき、 それがvectorのfill-pointerの初期値になります。

もしdisplaced-tonilではないとき、 make-arraydisplaced-todisplacedの配列の参照先とした displaced配列を作成します。 このような場合、displaced-toの実際の配列の要素の型と、 作成される配列の実際の配列の要素の型が 型として等しくなかったときの結果は未定義です。 もしdisplaced-tonilのとき、 配列はdisplacedの配列ではありません。

displaced-index-offsetは、配列のオフセットのインデックスになります。 配列Amake-arrayの引数:displaced-toとして与えられ、 配列Bが生成されたとき、 配列Bは配列Adisplacedしていると言われます。 その配列のすべての要素数を、配列の全サイズと呼びますが、 それは全ての次元の積として計算されます。 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ではない配列を作成する特定の方法はありません。


TOP, Github