Rainer Joswigが言うように、私はこの関数を書きません。標準はすでにを提供していますSET-DIFFERENCE
。それでも、関数の実装を提供する必要がある場合は、これを使用します。
(defun filter (a b)
(let ((table (make-hash-table)))
(map 'nil (lambda (e) (setf (gethash e table) t)) a)
(remove-if (lambda (e) (gethash e table)) b)))
このようにすることで、いくつかの利点が得られます。最も重要なのは、1b
回だけトラバースすることです。ハッシュテーブルを使用してどの要素が含まれているかを追跡すると、が長いa
場合にパフォーマンスが大幅に向上する可能性がありa
ます。
MAP
また、などの汎用シーケンス関数を使用REMOVE-IF
すると、この関数を文字列やベクトル、リストで使用できるため、標準SET-DIFFERENCE
関数よりも優れています。このアプローチの主な欠点は:TEST
、EQL
CLハッシュテーブルが事前定義された少数の等式述語(EQ
、、正確には)。EQL
EQUAL
EQUALP