Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2011-01-23

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

| 23:30 | C.I.CLを眺める(6) HASHED-SET-REMOVE-DUPLICATES - わだばLisperになる を含むブックマーク はてなブックマーク - C.I.CLを眺める(6) HASHED-SET-REMOVE-DUPLICATES - わだばLisperになる

今回は、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)
;=> "あかまきがみお"

というところ

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20110123