C.I.CLを眺める(6) HASHED-SET-REMOVE-DUPLICATES — #:g1

Posted 2011-01-23 14:30:00 GMT

今回は、C.I.CLのlist.lispから HASHED-SET-REMOVE-DUPLICATES です。
定義は、

(DEFUN HASHED-SET-REMOVE-DUPLICATES (SEQUENCE &KEY (TEST (FUNCTION EQL))
                                     (KEY (FUNCTION IDENTITY)))
  (LET ((TABLE (MAKE-HASH-TABLE :TEST TEST :SIZE (LENGTH SEQUENCE)))
        (RESULT '()))
    (MAP NIL (LAMBDA (ITEM) (SETF (GETHASH (FUNCALL KEY ITEM) TABLE) ITEM)) SEQUENCE)
    (MAPHASH (LAMBDA (KEY VALUE) (DECLARE (IGNORE KEY)) (PUSH VALUE RESULT)) TABLE)
    RESULT))
となっています。
LISTをSETにするには、REMOVE-DUPLICATESすることになると思うのですが、一旦ハッシュテーブルに登録して読み出すことにより重複を削除しています。
シンボルはEXPORTされていない様子。
何故か#'ではなくFUNCTIONと書かれていますが、PJBさんは割とリーダーマクロを使わずFUNCTIONをそのまま書いたりするようです。
動作は、
(import 'com.informatimago.common-lisp.list::hashed-set-remove-duplicates)

(hashed-set-remove-duplicates "あかまきがみあおまきがみきまきがみ") ;=> (#\HIRAGANA_LETTER_O #\HIRAGANA_LETTER_MI #\HIRAGANA_LETTER_GA ; #\HIRAGANA_LETTER_KI #\HIRAGANA_LETTER_MA #\HIRAGANA_LETTER_KA ; #\HIRAGANA_LETTER_A)

(COERCE (nreverse (hashed-set-remove-duplicates "あかまきがみあおまきがみきまきがみ")) 'STRING) ;=> "あかまきがみお"

というところ

comments powered by Disqus