Common Lisp/Emacs Lisp/Gauche Hash-table
おおまかだがハッシュテーブルについて理解したので、気分を変えがてら gauche の hash-table を眺めてみる。まず理解できる範囲で API を並べてみる。
項目 | Common Lisp | Emacs Lisp | Gauche | |
---|---|---|---|---|
生成 | make-hash-table | make-hash-table | make-hash-table | |
ハッシュ値 | sxhash | sxhash | hash | |
型判定 | hash-table-p | hash-table-p | hash-table? | |
getter | gethash | gethash | hash-table-get | |
setter | setf + gethash | puthash | hash-table-put! | |
count | hash-table-count | hash-table-count | hash-table-num-entries | |
clear | clrhash | clrhash | hash-table-clear!(0.8.11 以降) | |
traverse | maphash, loop | maphash, loop | hash-table-map, hash-table-for-each |
- http://gauche.sourceforge.jp/doc/gauche-refj_76.html gauche のリファレンスを参照。
- http://www.lisp.org/HyperSpec/Body/fun_sxhash.html#sxhash HyperSpec。
- gauche の hash は「hash は(そのデータのアドレスというような)実行時の計算機の状態とは独立しています。それゆえ、その値をファイルに格納し、別のプロセスで読み込んで利用しても、ハッシュ値の正当性を失うことがないので、安全です。」らしい。なるほど。
- Common Lisp の sxhash には、「循環する構造に対しても、sxhash の計算が終わらなくてはならない」とある。なるほど。
- gauche は組み込みで hash-table を持っている。SRFI-69 のハッシュテーブル(hash-table-set!とかがある)とはちょっと違う?
- gauche は命名規約がちゃんとしている。Emacs Lisp は Common Lisp にあわせているっぽいが、setf (汎用の setter)がないので puthash となっている。ちょっと格好悪い。
- clrhash は gauche だと hash-table-clear! ? gauche のソース extlib.c にはそれらしい定義がある。リファレンスにはない。実行するとエラー。=> おっと。0.8.11 で付け加えられたらしい。手元は 0.8.8 であった。
- AllegroCL の sxhash を循環構造にたいして計算してみる=>ok。なるほど。 Gauche の hash を循環のある構造に対して適用すると、や、止まらない? hash.c を見ると Scm_Hash という関数があるが、pair のときに単に再帰的に Scm_Hash を呼んでいるような。scheme を理解していないから誤解かもしれないが。最新版にして試すこと。
続く。