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 件のコメント:
コメントを投稿