% Function ADJUST-ARRAY
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 )
( iota kappa lambda mu )
( nu xi omicron pi ))
このとき、次に文を考えます。
(adjust-array m '(3 5) :initial-element 'baz)
結果は3×5の配列になり、内容は次の通り。
#2A(( alpha beta gamma delta baz )
( epsilon zeta eta theta baz )
( iota kappa lambda mu baz ))
なし。
fill-pointerがnil
で指定されたにもかかわらず、
arrayがfill-pointerを持たないときは、
型error
のエラーが発生します。
adjustable-array-p
,
make-array
,
array-dimension-limit
,
array-total-size-limit
,
array
なし。