CL に慣れていないので、単純なアルゴリズムでよく遊んでいます。たとえば、リスト内のすべての一意の要素を削除する関数を実装しようとしました。
(1 2 2 3 3 4 5 3) -> (2 2 3 3 3)
最初の試みはこのコードにつながります:
(defun remove-unique (items)
(let ((duplicates (set-difference items (remove-duplicates items :test #'equal))))
(append duplicates (remove-duplicates duplicates :test #'equal))))
これは文字列では問題なく機能しますが、数値では常に返さNIL
れます。もう少し詳しく読んでset-difference
みると、データが入力されたリストが重複して機能することはまったく想定されていないことがわかりました。
別の試みは次のとおりです。
(defun remove-unique (items)
(loop for item in items
when (member item (cdr (member item items)))
collect item))
これは数値では問題なく機能しますがNIL
、文字列では戻ります。
どうやら私が理解していない文字列と数値の間にはコアの違いがあります。member
やなどのリスト処理関数はset-difference
、なぜそれらに対して異なる働きをするのでしょうか?