#:g1: CDR 2: A generic hash table interface specification for Common Lispの紹介

Posted 2014-06-13 13:30:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の164日目です。

CDR 2: A generic hash table interface specification for Common Lispとはなにか

 CDR 2: A generic hash table interface specification for Common Lispは、Ingvar Mattsson氏のテスト関数を標準の4つ以外にも使えるように拡張したハッシュテーブルの提案です。
CDR-2としてファイナルになっています。

パッケージ情報

パッケージ名genhash
CDR:CDR 2: A generic hash table interface specification for Common Lisp
CLiKihttp://cliki.net/genhash

インストール方法

 CDR-2に記載の参照実装のURLはリンク切れですが、githubに置いている方がいるので、git cloneして、Quicklispのlocal-projectsに置いておけば、

(ql:quickload :genahsh)

で読み込めます。

試してみる

 定義されている関数は、下記の通り。Common Lisp標準のhash-tableの関数にそれぞれ対応したものがあります。

コンディションも定義されています。

char-equalなハッシュテーブルの作成

 register-test-designatorでtest designerを登録すれば、make-generic-hashtableでテーブルを作成できます。


(genhash:register-test-designator 'char-equal #'char-equal-hash #'char-equal)

(let ((tab (genhash:make-generic-hash-table :test 'char-equal))) (setf (genhash:hashref #\a tab) t (genhash:hashref #\λ tab) t) (list (genhash:hashref #\a tab) (genhash:hashref #\A tab) (genhash:hashref #\b tab) (genhash:hashref #\B tab) (genhash:hashref #\λ tab) (genhash:hashref #\Λ tab))) ;=> (T T NIL NIL T T)

(let ((tab (genhash:make-generic-hash-table :test 'char-equal))) (setf (genhash:hashref 'a tab) t)) ;!> The value A is not of type CHARACTER.

 test designatorとしては、(quote foo)もしくは、(function foo)が取れるようなのですが、登録は、(quote foo)の形式である必要があるようです。
さらに参照実装では、make-generic-hash-tableは、(quote foo)と(function foo)を同一のものとは見做してくれないので、実質(quote foo)形式で書くことになっています。

まとめ

 今回は、CDR 2: A generic hash table interface specification for Common Lispを紹介してみました。
CDRも現在14位まで進んでいますが、今後もぼちぼち紹介してみたいと思います。

comments powered by Disqus