本記事は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 '(:meiko red :kaito blue :miku green)) ; => (: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 :miku color) ; => green
ハッシュテーブルは,今回調べていて初めて存在を知りました.Emacsで 大量のkeyとvalueを扱う場合は素直にハッシュテーブルを使うのがよさ そうですね.
おわりに
EmacsLispでkeyとvalueを扱う構造について紹介しました. Emacs で IPC や RPC (Emacs Advent Calendar jp: 2011) – 技術 日記@kiwanamiのように,emacs lispから外部の言語やDBにアクセスす る試みも行われています.RDBやKVSをemacsから使う日もそう遠くはなさ そうです.