重複を取り除くとか。

シーケンス関連が充実してるCommon Lispですが、ユニーク化したり、重複を見つけ出したりする楽な方法がわからずに結局関数を書くことに。以下のような感じなのですが、どなたかもっと正統な方法教えてくださらないものか・・・・。

(defun unique (lst &key test)
  (let ((test-fn (if test test #'equal)))
    (labels
	((r (lst uniq)
	   (if lst
	       (if (member (car lst) uniq :test test-fn)
		   (r (cdr lst) uniq)
		   (r (cdr lst) (cons (car lst) uniq)))
	       (nreverse uniq))))
      (r lst nil))))

(defun overlap (lst &key test)
  (let ((test-fn (if test test #'equal)))
    (labels
	((r (lst uniq un-uniq)
	   (if lst
	       (if (member (car lst) uniq :test test-fn)
		   (r (cdr lst) uniq (cons (car lst) un-uniq))
		   (r (cdr lst) (cons (car lst) uniq) un-uniq))
	       (nreverse un-uniq))))
      (r lst nil nil))))