2012/06/26

だいたいこれくらい動いちゃうと

満足して実装したい衝動が消えちゃう。。。

https://github.com/quek/info.read-eval-print.active-record

(establish-connection)

(defrecord prefecture ()
()
(:has-many :facilities))

(defrecord facility ()
()
(:belongs-to :prefecture)
(:has-many :experiences :as :experiencable))

(defrecord experience ()
()
(:belongs-to :experiencable :polymorphic t))

(let ((facilities (with-ar (facility)
(where "name like ?" "%水族館")
(where :publish 1)
(order :name)
(get-list))))
(values
(mapcar #'name-of facilities)
(name-of (prefecture-of (car facilities)))))

(facilities-of (with-ar (prefecture)
(where "id = 1")
(get-first)))

(experiences-of (with-ar (facility)
(get-first)))

(experiencable-of (with-ar (experience)
(get-first)))

(with-ar (facility)
(joins :prefecture)
(where :prefectures.name "鳥取県")
(get-list))

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))

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

2012/06/17

rm -rf ~/.opera

Opera の調子がずっとよくなかった。 Facebook, Twitter がまともに動かない。エクステンションはことごとく「XML の解析に失敗しました」といエラーになる。

いいかげん他のブラウザを使うべきもかしれないと、本気で考えていた。他のブラウザにするぐらいなら ~/.opera を捨ててみるか、と rm -rf ~/.opera してみた。

全てが解決した。バージョン 8 くらいから使い続けていた ~/.opera だったので、最近の Opera ではいろいろと不都合があったのでしょう。