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 LispCommon 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 を理解していないから誤解かもしれないが。最新版にして試すこと。


続く。