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