改造 GCaml の書き直しもしくは $Caml #0

型レベルプログラミングの会に参加して昔の仕事を色々いじっている内に、いろいろと思うところあって GCaml を再生産しています。といっても取り合えずは型レベル方向じゃ無いのですいません。

六年も前にやったことって人間覚えていない、というか、意識的に無意識下に押し込めた上、フタをして結構忘れているものですが、無意識では考えているらしく、久々に考え直していると反省点が良く見えてくる。D論書いているときは必死でよく見えてなかったものが、六年後に風呂入っていると突然見えたりする。まぁ言ってしまえば、定期試験の前に純文学を読み漁ったり、定期試験が終わってから勉強してみたり、そういうのあるでしょ?逃避って言うんだっけ?研究職やめたら(って一応今も quantitative researcher ってことになってるけど)今まで研究者の癖にあんまり研究したくなかったのが、今頃になって無性にしたくなってきた。フラフラっと寄り道しながら、本道を逸脱しすぎず、生きて行きたい。そんな、感じ。まぁ在野のおじさんの独自研究だと思ってください[要出展]。OCaml に実装して遊ぶのが本題で、学術的には再生産っぽい。そんなんもうあるヨってんならそれでもいいです。そうじゃなかったら論文書いてみてもいいかもね。

Type class とか overloading とかを実現する機構は実は一つじゃなくて、いろんなものが寄せ集まって出来ているのですが、GCaml ではそれを完全に一つにまとめてパッケージにして売り出していました。なので、実装も大変だったし、中身も良くわかんなかった。そこで、それを一つ一つに分解して実装して見ようと思います。

まずは、dispatch 周りからです。Type class 等では program transformation して、context の部分 => が普通の -> に変わって、それが dictionary passing style (dispatching) になる*1んですが、これを真面目に実装せずに、逆にしてみます。要するに初めから普通の -> なんだけど、ちょっと毛が生えてて、type inference が特別扱いしてくれるので => に見えなくも無い、という物を作って見る。そうすりゃ => なんて lexical symbol 作らなくていいし、 type algebra も変に拡張しなくていいから。そう、こんな感じで、基本は手を抜くです。もう20代じゃないので力技は勘弁なのです。

続きます。