repl.info

Emacsのデータストアを見てみる

本記事はEmacs Advent Calendar jp: 2011 : ATNDの23日目です. emacs lispで,keyとvalueを扱う方法について調べていたので,そのま とめです. emacs lispでkey-valueを扱う方法としては,alist(連想リスト), plist(属性リスト),ハッシュテーブルがあるようです. alistとplistはS式を使ったもので,シンプルです.ただ,リストを順番 に見ていくため,計算量は最悪の場合O(n)となり,効率が悪そうです. ハッシュテーブルの場合,計算量はO(1)なので,大量のデータを扱う場 合はplistやalistより速いのですが,データをS式で扱うのではなくハッ シュテーブル型になります. どれを使うかは,用途によるでしょう,plistはユーザが設定を書く時に よく使われますね.

alist(連想リスト)

alist(association list)はコンスセルを用いたリスト.

(setq color '((meiko . red)

              (kaito . blue)

              (miku . green))); =\> ((meiko . red) (kaito . blue) (miku . green))(assoc 'miku color); =\> (miku . green)(rassoc 'red color); =\> (meiko . red)

keyを与えるとkeyとvalueのコンスセルが返ってきます.valueを取り出 すためにcdrを使うのが少し手間な気がします.

plist(属性リスト)

plist(property list)は属性を保持するためのリスト.

(setq color '(:meikored:kaitoblue:mikugreen)); =\> (:meiko red :kaito blue :miku green)(plist-get color:meiko); =\> red(plist-put color:ruka'pink); =\> (:meiko red :kaito blue :miku green :ruka pink)

個人的に好きなデータ構造です.リストなので扱いやすいためです.

hash table

名前の通り,ハッシュテーブル.

(setq color (make-hash-table)); =\> #s(hash-table size 65 test eql rehash-size 1.5 rehash-threshold 0.8 data ( ...))(puthash:miku'green color); =\> green(gethash:mikucolor); =\> green

ハッシュテーブルは,今回調べていて初めて存在を知りました.Emacsで 大量のkeyとvalueを扱う場合は素直にハッシュテーブルを使うのがよさ そうですね.

おわりに

EmacsLispでkeyとvalueを扱う構造について紹介しました. Emacs で IPC や RPC (Emacs Advent Calendar jp: 2011) – 技術 日記@kiwanamiのように,emacs lispから外部の言語やDBにアクセスす る試みも行われています.RDBやKVSをemacsから使う日もそう遠くはなさ そうです.