Emacs Lisp Hash-table 続き

※何故こんなことを調べているかというと、低レベルなプログラミングをちゃんと勉強しておこう、という目的があって、Elisp が手頃な教材なため。

Emacs にも Hash-table がある。よく使われるリスト構造の alist に比べ、データの数が多くなっても遅くならないという長所がある。
構造体は src/lisp.h で、操作は src/fns.c で定義されている。
Hash-table へのアクセスは、 gethash/puthash 、全要素へ関数を適用する maphash などがある。
loop マクロは Common Lisp 同様、ハッシュテーブルの全要素へのアクセスに使える。

現時点では、ハッシュテーブルの実装を追うことがスキル的にできない。Cのマクロの固まりで、追いかけないと何をやっているか不明。
が、C レベルの、つまり、”データ構造”というある意味仮想的なものをメモリー上に対応させるための仕組みのはず。Lisp 世界と C の世界をつなぐコードを書くのはなかなか大変そう。src/lisp.h には、Lisp_Cons の定義もある。

そのうち Gauche のソースも眺めてみよう。

速度比較をしてみたが、予想以上に大きなデータサイズ、大量のデータ要素へのアクセスでないと alist と Hash-table の差が出なかった。何か勘違いしていそうなので、ちょっと保留。低レベルデータ構造のちょっとした比較、も知っておきたいスキルの一つなので、あとでやる。