リスト同士の和・差・積を取る - 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 処理系依存)