npt-japanese

% Function MERGE

UP


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-1sequence-2predicateが決める順にしたがって 破壊的にマージします。 mergeは、keyによる要素の展開とpredicateの実行によって、 2つの要素間の関係を決定します。

predicate関数の最初の引数は、 key関数によって展開された(もしkeyが指定されたのなら)、 sequence-1の要素の部分であり、 二番目の引数は、 key関数によって展開された(もしkeyが指定されたのなら)、 sequence-2の要素の部分です。 predicateは、第一引数が第二引数より(何らかの適切な意味で)、 厳密に小さい場合にのみtrueを返すべきです。 もし最初の引数が二番目の引数が(何らかの適切な意味で)、 以上であるときは、predicatefalseを返却するべきです。 mergeは、2つの要素xy (funcall predicate x y)(funcall predicate y x)が 両方ともfalseであるときに、等しいとみなすと仮定しています。

key関数の引数は、sequenceの要素です。 通常、key関数の返却値は、predicateの引数になります。 もしkeyが与えられないか、あるいはnilが指定されたとき、 sequenceの要素そのものが使用されます。 keyは、各シーケンスの要素に対して、 複数化呼び出される可能性があるので、 副作用は任意の順番で呼び出されるかもしれません。

もしkeypredicateが返却すれば、マージ操作も終了します。 2つのシーケンスxyのマージした結果を、 result-typeの新しいシーケンスzとしたとき、 zの長さは、xyの長さの合計であり、 zにはxyの全ての要素が含まれます。 もしx1x2xの2つの要素であり、 x内でx1の方がx2より先行しているとき、 z内でもx1の方がx2より先行しており、 yの要素も同様です。 要するに、zxyのインターリーブです。

もしxypredicateに従って正しくソートされれているならば、 zもまた正しくソートされています。 xyがソートされていないのであれば、 zはソートされていませんが、 それでもxyのインターリーブとなります。

マージ操作は安定性が保証されます。 もし2つかそれ以上の要素がpredicateによって等しい場合、 返却値は、sequence-1のそれらの要素の方が、 sequence-2のそれらの要素よりも優先されます。

sequence-1sequence-2は 破壊されるかもしれません。

もしresult-typelistのサブタイプの場合、 リストが返却されます。

もしresult-typevectorのサブタイプの場合、 実装が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-1sequence-2の合計の長さが違う場合は、 型type-errorのエラーが発します。

参考

sort, stable-sort, 3.2.1. コンパイラーの用語, 3.6. 横断の規則と副作用

備考

なし。


TOP, Github