[View] [Edit] [Attachments] [History] [Home] [Changes] [Search] [Help]

elisp でハッシュ


Perl ではハッシュ、Smalltalk では Dictionary (Javascript のオブジェクト、
STL の map) という便利なデータ構造があって、キーワードと値の組をセットで保存、
高速検索を行う事が出ます。elisp ではちょっと変な方法になっているので、
忘れないようにメモ。

簡単な使い方


まず、辞書(シンボルテーブル = キーの表)を作ります。
辞書は、長さが素数で値が全部 0 の配列が良いそうです。
(setq table (make-vector 3 0))

辞書に登録
これで、table という表に、"パール" -> "Perl" の組を保存します。
(set (intern "パール" table) "Perl")

辞書を検索する。
table という表にある "パール" のキーを取り出します。
(symbol-value (intern-soft "パール" table))

基本的な使い方はこれだけです。なぜこんなにややこしいかと言うと、
この機能は関数や変数の保存等の elisp の内部的な仕組みに使われている物を
辞書として他の仕事に使おうとしているからです。ユーザ用じゃないのかな?

内部


では中身はどうなっているのでしょうか?
先ほど、make-vector でシンボルテーブルを make-vector で作りました。
でも長さとして 3 を指定しましたね。3つ以上入れるとどうなるのかな?
(set (intern "パール" table) "Perl")
(set (intern "スクイーク" table) "Squeak")
(set (intern "ルビー" table) "Ruby")
(set (intern "ハスケル" table) "Haskell")

ここで、table を評価すると、[ルビー 0 ハスケル] が返ります。
ヤバイ、消えてしまったのかも。でも安心。

(let ((keys))
(mapatoms (lambda (sym)
(setq keys (cons sym keys))) table)
keys)
=> (パール スクイーク ルビー ハスケル)

elisp は、最初に作ったシンボルテーブルを利用して、どうやら特別な方法で
辞書を管理するようです。辞書全体にアクセスするには、直接辞書を評価しないで
mapatoms という関数を使います。

深淵


ここで、なんとなく謎めいた気持ち悪い感じがしている人は正解です。
説明されていない謎が沢山あるからです。ヒントだけ書きます。


参考


Link to this Page

propella home