% 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. 横断の規則と副作用
なし。