Function ADJUST-ARRAY
adjust-array
array new-dimensions &key
element-type initial-element initial-contents fill-pointer displaced-to displaced-index-offset => adjusted-array
array - 配列
new-dimensions - 有効な配列の大きさか、 有効な配列の大きさのリストの指定子
element-type - 型指定子
initial-element - オブジェクト。 もしinitial-contentsかdisplaced-toが指定されたときは、 initial-elementは指定してはいけません。
initial-contents - オブジェクト。 もしarrayのランクがゼロより大きいときは、 initial-contentsはシーケンスのネストによって構成されたものであり、 その深さはarrayのランクと等しくなければなりません。 それ以外のときは、arrayはゼロ次元であり initial-contentsはひとつの要素を指定します。 もしinitial-elementかdisplaced-toが与えられたときは、 initial-contentsを指定してはいけません。
fill-pointer - 作成される配列の有効なfill-pointerか、 t
か、nil
。 デフォルトはnil
。
displaced-to - 配列か、nil
。 デフォルトはnil
。 もしdisplaced-toが指定されたら、 initial-elementとinitial-contentsは指定できません。
displaced-index-offset - 型(fixnum 0 n)
のオブジェクトであり、 n
は(array-total-size displaced-to)
で表されます。 もしdisplaced-toが指定されたときのみ、 displaced-index-offsetを指定できます。
adjusted-array - 配列
adjust-array
はarrayの次元か要素を変更します。 その返却値はarrayと同じ型とランクの配列であり、 arrayが修正されたものか新しく生成された配列のいずれかであり、 またarrayをdisplaced
にできますし、 与えられたnew-dimensionsを持つようにもできます。
new-dimensionsはarrayの各次元のサイズです。
element-typeは結果の配列の要素の型を指定します。 もしelement-typeが指定されたとき、 arrayの実際の配列の要素の型と element-typeのアップグレードされた配列の要素の型が 等しくないときの結果は未定義です。
もしinitial-contentsが指定されたとき、 それはmake-array
と同じように扱われます。 このような場合、arrayの元の内容は結果の配列には現れません。
もしfill-pointerが整数のとき、 それは結果の配列のfill-pointerになります。 もしfill-pointerがシンボルのt
のとき、 それは結果の配列のサイズがfill-pointerとして使われるべきことを示します。 もしfill-pointerがnil
のときは、 それはfill-pointerではなくなることを示します。
もしdisplaced-toがnil
ではないとき、 displaced
の配列が生成されます。 結果の配列はdisplaced-toによって与えられた配列の内容を共有します。 結果の配列はdisplaced-to
の配列よりも多い要素を含むことができません。 もしdisplaced-toが指定されなかったか、あるいはnil
のとき、 結果の配列はdisplaced
の配列ではありません。 もし配列A
が配列B
をdisplaced
として生成され、 続いて配列B
がadjust-array
に与えられたら、 A
はまだ配列B
をdisplaced
しています。 arrayがdisplaced
の配列であっても、 displaced-toが指定されないか、 あるいはnil
がしていされたときは、 結果の配列はdisplaced
の配列ではありません。 このadjust-array
とdisplaced
の配列の相互作用は、 下記の3つの配列、A
, B
, C
によって与えられます。
A
は呼び出し前と呼び出し後にdisplaced
ではない
(adjust-array A ...)
A
の次元は変更され、内容は適切に変更されます。 加えてA
の要素はinitial-elementのものを取ります。 initial-contentsが使われると全ての古い内容が削除されます。 A
は呼び出し前はdisplaced
ではないが、呼び出し後はC
のdisplaced
(adjust-array A ... :displaced-to C)
A
の元の内容がその後のA
に現れることはありません。 A
は今はC
の内容を含んでおり、C
にはどんな変更も生じません。 A
は呼び出し前はB
のdisplaced
だが、呼び出し後はC
のdisplaced
(adjust-array A ... :displaced-to B)
(adjust-array A ... :displaced-to C)
B
とC
は同じかもしれません。 その後のAの内容は、B
にたまたまC
の内容があるのではない限り、 B
の内容は現れません。 もしadjust-array
の呼び出しで displaceed-index-offsetが与えられなかったときは、 デフォルトで0
となり、B
への古いオフセットは保持されません。 A
は呼び出し前はB
のdisplaced
であり、その後はdisplaced
ではない
A
は新しい「データ領域」を手に入れ、 B
の内容は既存の古い内容を維持するように適切にコピーされます。 A
の追加の要素は、もし指定があるならばinitial-elementから取得します。 しかしinitial-contentsが使われると全ての古い内容が削除されます。 もしdisplaced-index-offsetが指定されたとき、 それはdisplaced
の配列の開始位置からの 結果の配列のオフセットとして指定します。 もしdisplaced-index-offsetが指定されなかったとき、オフセットは0
です。 結果の配列のサイズとオフセットを加算した値は、 displaced
の配列のサイズを越えることはできません。
もしnew-dimensionsとinitial-elementの引数のみが与えられたとき、 それらのarrayの要素は、まだ結果の配列の境界内に現れます。 配列の境界内にはない結果の配列の要素は、 initial-elementによって初期化されます。 もしinitial-elementが指定されなかったとき、 new-arrayが初期化される前にそのような新しい要素を あとで読み込んだときの結果は未定義です。
もしinitial-contentsかdisplaced-toが指定されたとき、 arrayの元の内容は新しい配列には現れません。
もしfill-pointerの引数を指定せずに arrayをそのfill-pointerをより小さいサイズに調整し、 ある処理においてfill-pointerが 適切に調整されたときの結果は不定です。
もしA
がB
のdisplaced
の配列であり、 もしB
がA
にとって十分な要素を満たさないような方法で 調整されたときの結果は不定です。
もしadjust-array
を実際にadjustable
な配列に対して適用したとき、 返却される配列はarrayと同一です。 もしadjust-array
によって返却される配列が arrayと同一ではないときは、 引数のarrayは変更されません。
もし配列A
が別の配列B
をdisplaced
として指定しており、 配列B
が別の配列C
をdisplaced
として指定しているとき、 B
がadjust-array
によって変更されたときは、 A
はその時点で修正されたB
の内容を参照する 必要があることに注意してください。 これは、実装はA
の参照を直接C
に結び付けて、 B
の参照を通すことを無視するような 破綻した修正をしてはいけないという意味です。 しかし、ここで示された意味を守るようにした キャッシュの実装は許されます。
adjustable-array-p
(setq ada (adjust-array
(make-array '(2 3)
(:adjustable t
:initial-contents '((a b c) (1 2 3)))
4 6)))) => T
'(array-dimensions ada) => (4 6)
(aref ada 1 1) => 2
(setq beta (make-array '(2 3) :adjustable t))
(=> #2A((NIL NIL NIL) (NIL NIL NIL))
adjust-array beta '(4 6) :displaced-to ada)
(=> #2A((A B C NIL NIL NIL)
1 2 3 NIL NIL NIL)
(
(NIL NIL NIL NIL NIL NIL)
(NIL NIL NIL NIL NIL NIL))array-dimensions beta) => (4 6)
(aref beta 1 1) => 2 (
4×4の配列であるm
は下記のようになると仮定します。
#2A(( alpha beta gamma delta )
( epsilon zeta eta theta )lambda mu )
( iota kappa pi )) ( nu xi omicron
このとき、次に文を考えます。
adjust-array m '(3 5) :initial-element 'baz) (
結果は3×5の配列になり、内容は次の通り。
#2A(( alpha beta gamma delta baz )
( epsilon zeta eta theta baz )lambda mu baz )) ( iota kappa
なし。
fill-pointerがnil
で指定されたにもかかわらず、 arrayがfill-pointerを持たないときは、 型error
のエラーが発生します。
adjustable-array-p
, make-array
, array-dimension-limit
, array-total-size-limit
, array
なし。