% 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
なし。