リスト同士の和・差・積を取る - lisp-cookbook-ja/common-lisp GitHub Wiki
リスト同士の和・差・積を取る
リストの和集合を得るには、union
リストの差集合を得るには、set-difference
リストの積集合を得るには、intersection
が使えます。 結果リストの要素の順番については、保証されていません。
(union '(1 3 5 7) '(2 4 6 8)) ;=> (8 6 4 2 1 3 5 7)
(union '(1 2 3 4) '(3 4 5 6) :test #'eql) ;=> (6 5 1 2 3 4)
(set-difference '(1 3 5 7) '(2 4 6 8)) ;=> (7 5 3 1)
(set-difference '(1 2 3 4) '(3 4 5 6)) ;=> (2 1)
(intersection '(1 3 5 7) '(2 4 6 8)) ;=> ()
(intersection '(i 2 3 4) '(3 4 5 6)) ;=> (4 3)
また、処理系依存で与えられたリストと結果の内容が同一の場合は、元のリストを返却しても構わないことになっていますので、上記3つの処理の結果のリストを破壊的に変更する場合にはコピーを渡してやる必要があります。
(let ((x '(1 2 3 4)))
(eq x (union x ())))
;=> T(or nil 処理系依存)