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

Pocket

本記事は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から使う日もそう遠くはなさ そうです.

Leave a Reply

Your email address will not be published. Required fields are marked *