0809
昨晩寝る前と今日はSwiftを書いていました。
https://github.com/kylef/QueryKit
そう、こういうのをやりたかったのです(そしてやられていた)。演算子オーバーロードでこういう感じにするのは考えてなかった、すごい。でもAttribute<T>のくだりは微妙な気がする、結局自分で書かないとコンパイル時に検査してくれないんならあきらめたほうがスマートっぽい。とりあえずその方向で書いています。「Book.find(Book).filter("price", <, 2000)」みたいになります。findの不細工なBookは、言語仕様上の不具合?によるものなので、いずれなくしたい(具体的には、クラスメソッドの返り値の型にSelfは指定できるんだけど[Self]やArray<Self>を指定できないことが問題で、ちゃんと[Book]を返すためにBookを外部から注入してやる必要があるわけです。一見するとただの不具合っぽいんだけど、でも型推論の理論をよく知らないからもしかすると本質的に難しい問題を孕んでいて禁止されているのかも。そうだったら嫌だな)。とりあえずFetchRequestを実行することはできたので、あとはSequenceにしてfor文で回したりsubscriptに対応したりみたいなことをがんばろうかな(上のライブラリではすでに対応されているけれど)。ただ結局本質的に遅延ロードみたいなことができるのかはよくわからない。キャッシュとかもよくわからない。
あと、マルチスレッドでやるときに常にcontext-awareでなければならないのが厄介なので、構文的に逸脱が起こらないようにして普段はコンテキストのことを忘れられるようにしたいと思っていて、具体的にはクロージャの中で触るデフォルトのコンテキストをライブラリ側で指定してやる機構(こうすることでperformBlock内で触るべきコンテキストを決定できる)をつくりたい。こちらはMagicalRecordのCoreDataStackに乗っかった形では実現できたのだけど、どうもメモリ管理やキャスティングの周辺に謎の不具合があるのか僕の仕様理解が悪いのか落ちます。困った。あとそのうちStackもきちんと書きたい(でもそのへん一般化して書こうとすると面倒だし結局MagicalRecordのコピーになりそうなんだよねえ)。
身体の調子はあいかわらずよくないです。今日はちょっと風邪っぽいな。はー。