最近本当に非生産的な日々だけど、何も書かないと本当に何も無かった事になりそうなので淡々と週末の事を書く。
ある日郵便受けを見ると、マルカイとか言うスーパーのチラシが入っていた。どうも以前の住人に向けた DM だったようだが、日本スーパーのチラシが入るなんて珍しいのでパラパラめくると敷布団の特売が書いてあった。70ドル程。前に買ったリトルトーキョーのは200ドルはしたのでこれはお得だ。母と妹が月末に来る予定なので、丁度良いと買いに言った。マルカイは何と言うか、スキー旅行に行ったついでに立ち寄った田舎のでかいスーパーみたいな雰囲気だった。長野っぽい感じ。で、敷布団は良いのだが、掛け布団の方は連れ込み旅館みたいなデザインの物しか無かったので買うのをやめた。
と言うと着々と買い物を進めているみたいだけど、私の脳はずっと作りかけのエディタの設計に支配されていて、布団を買うだけにずいぶんかかった。布団の前にまずフードコートでハックして、勝ってからスタバでハックして、それから帰った。ちなみにまだ掛け布団は買っていない。今日 BATH and BED and BEYOND にも行ったんだけど、どれが掛け布団なのか分からなかった。
で、掛け布団について検討するためにトーランスの Panera でコーヒーを飲みつつ、ついでに Gtk のテキストエディタのソースコードを読んでいた。けど、難しすぎてさっぱり分からない。関数の名前から、どうもテキストを B-Tree で管理しているようなのだが、匿名ポインタが多すぎてウォッチが役に立たないし、これでよくやっていけてるなー。それでもコメントは豊富だしドキュメントはちゃんとしてるし、多分慣れると勉強になると思う。
今考えている設計はこんなの。テキストエディタを、入力がイベント列で出力がコマンド列である関数と考える。あと、入力にはイベントの他にも現在のテキストの状態も含まれる。テキストエディタは旧状態を参照できるけど、変更するにはコマンドを通さないと行けない。これで参照透過性が実現出来るし、UNDO の実装も簡単で一石二鳥。
(イベント列 + 旧状態) => エディタ => コマンド => 新状態
いわゆるコマンドパターンなんだけど、これってみんなを怖がらせないで密かに関数言語的設計を仕込んで行くのに最適なのではと思っている。MVC だとか MVP だとか言う時はオブジェクトの空間的な関係に重点が置かれるけど、コマンドパターンの時間的な関係が結構気に入っている。
技術的に面白くなりそうな点は、読みやすいコードのためにはコルーチンが必須になる事。例えば、マウスをドラッグしている時はドラッグに合わせてハイライトを変えないといけないけど、処理のまとまりとしては、マウスダウン - マウスムーブ - マウスアップと一つのルーチンに連なって書きたい。しかし事はマウスムーブの最中にコマンドを発行しないといけないんだけどルーチンから抜けたくない。という事はイベント処理をするルーチンとコマンドを発行するルーチンが強調して動く事になる。しかも贅沢を言うと マウスムーブ - マウスアップ という操作の流れと マウスムーブ - ハイライト という因果関係の流れの二つを両方デバッガで追えるようにしたい。
という事で、たかがエディタの実装でも沢山面白い問題があるという事を考えつつ何も収穫の無い休日だった。