% Function MERGE
Function MERGE
merge result-type sequence-1 sequence-2 predicate
&key key => result-sequence
result-type - sequenceの型指定子
sequences-1 - シーケンス
sequences-2 - シーケンス
predicate - 2つの引数をとりgeneralized-booleanを返却する関数の指定子
key - 1つの引数を取る関数の指定子、またはnil
result-sequence - 型result-typeの正常なシーケンス
sequence-1とsequence-2を
predicateが決める順にしたがって
破壊的にマージします。
mergeは、keyによる要素の展開とpredicateの実行によって、
2つの要素間の関係を決定します。
predicate関数の最初の引数は、
key関数によって展開された(もしkeyが指定されたのなら)、
sequence-1の要素の部分であり、
二番目の引数は、
key関数によって展開された(もしkeyが指定されたのなら)、
sequence-2の要素の部分です。
predicateは、第一引数が第二引数より(何らかの適切な意味で)、
厳密に小さい場合にのみtrueを返すべきです。
もし最初の引数が二番目の引数が(何らかの適切な意味で)、
以上であるときは、predicateはfalseを返却するべきです。
mergeは、2つの要素xとy
(funcall predicate x y)と(funcall predicate y x)が
両方ともfalseであるときに、等しいとみなすと仮定しています。
key関数の引数は、sequenceの要素です。
通常、key関数の返却値は、predicateの引数になります。
もしkeyが与えられないか、あるいはnilが指定されたとき、
sequenceの要素そのものが使用されます。
keyは、各シーケンスの要素に対して、
複数化呼び出される可能性があるので、
副作用は任意の順番で呼び出されるかもしれません。
もしkeyとpredicateが返却すれば、マージ操作も終了します。
2つのシーケンスxとyのマージした結果を、
result-typeの新しいシーケンスzとしたとき、
zの長さは、xとyの長さの合計であり、
zにはxとyの全ての要素が含まれます。
もしx1とx2がxの2つの要素であり、
x内でx1の方がx2より先行しているとき、
z内でもx1の方がx2より先行しており、
yの要素も同様です。
要するに、zはxとyのインターリーブです。
もしxとyがpredicateに従って正しくソートされれているならば、
zもまた正しくソートされています。
xとyがソートされていないのであれば、
zはソートされていませんが、
それでもxとyのインターリーブとなります。
マージ操作は安定性が保証されます。 もし2つかそれ以上の要素がpredicateによって等しい場合、 返却値は、sequence-1のそれらの要素の方が、 sequence-2のそれらの要素よりも優先されます。
sequence-1とsequence-2は 破壊されるかもしれません。
もしresult-typeがlistのサブタイプの場合、
リストが返却されます。
もしresult-typeがvectorのサブタイプの場合、
実装がresult-typeを要素の型として決めることができるのであれば、
その要素の型をアップグレードした結果が返却値の配列の要素の型になります。
しかし実装が要素の型を決定できないか、あるいは*のときは、
返却値の配列の要素の型はtになります。
その他の場合はエラーが発生します。
(setq test1 (list 1 3 4 6 7))
(setq test2 (list 2 5 8))
(merge 'list test1 test2 #'<) => (1 2 3 4 5 6 7 8)
(setq test1 (copy-seq "BOY"))
(setq test2 (copy-seq :nosy"))
(merge 'string test1 test2 #'char-lessp) => "BnOosYy"
(setq test1 (vector ((red . 1) (blue . 4))))
(setq test2 (vector ((yellow . 2) (green . 7))))
(merge 'vector test1 test2 #'< :key #'cdr)
=> #((RED . 1) (YELLOW . 2) (BLUE . 4) (GREEN . 7))
(merge '(vector * 4) '(1 5) '(2 4 6) #'<) should signal an error
なし。
result-typeが、
listのサブタイプでも、
vectorのサブタイプでもないとき、
型type-errorのエラーが発します。
result-typeで指定した要素数と、
sequence-1とsequence-2の合計の長さが違う場合は、
型type-errorのエラーが発します。
sort,
stable-sort,
3.2.1. コンパイラーの用語,
3.6. 横断の規則と副作用
なし。