[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 という関数を使います。
深淵
ここで、なんとなく謎めいた気持ち悪い感じがしている人は正解です。
説明されていない謎が沢山あるからです。ヒントだけ書きます。
- intern とは何か?
- intern は文字列をシンボルという特別な存在に変えます。一つの辞書には一つのシンボルしか入れる事が出来ません。
- 値はどこに入っている?
- シンボルは elisp を司る重要なオブジェクトで、関数、値、属性という複数の性質を持っていて、シンボル自体に値を入れる事が出来ます。(Smalltalk のシンボルとは全然違います)
参考
Link to this Page
- elisp last edited on 26 March 2004 at 9:39:10 pm by 192.168.0.5