2012/06/24

Common Lisp ならスペシャル変数とマクロで

ときどき Active Record を Common Lisp で実装したくなる。それでひっかかるものの一つがメソッドチェーン。

Ralis の Active Record Query Interface や jQuery や S2JDBC とか、メソッドチェーン多いよね。でも、Common Lisp だとメソッドチェーンはやりにくい。

リーダマクロという手はあるが、 Common Lisp らしくスペシャル変数と with 系マクロでいきたいと思う。

こんな感じになる。

(with-ar (facility)
(where "name like ?" "%水族館")
(when only-published-p
(where :publish 1))
(order :name)
(get-list))

with-ar でかこんで、後は普通に関数呼び出し。メソッドチェーンは条件分岐があるとめんどうだけで、普通の関数呼び出しだから when や if の条件分岐とかも間に入れられる。

次のような defvar と defmacro だけで簡単にできちゃう。

(defvar *association* nil "association")

(defmacro with-ar ((table) &body body)
`(let ((*association* (ensure-association ,table)))
,@body))

好きな言語がスペシャル変数とマクロのある言語でよかった。

0 件のコメント: