D 言語会議 #1 に参加しました

http://partake.in/events/feac18f7-0b78-4129-92c5-ad0cce8feafb

参加者数に余裕ありそうだったので、飛び入りで参加しました。D とか最早何も知りませんけども…
忘れないうちに、覚えていることを書き残しておきます。


kinaba さんの opEquals と toHash が何か全然ダメだよという話。つまり http://www.ibm.com/developerworks/jp/java/library/j-jtp05273/index.html この辺。ハッシュ関数とか皆割りとどうでもいいとおもってるのか、単に問題が発覚していないだけか…。

その後は D のコードリーディングを一人で開始。周りは dll が云々とか言っていましたが、よく聞いてはいませんでした。
愚直に main から読み始めて、いきなりユニットテストから始まる main とか新鮮だなあとか色々あって、そろそろパーサー読もう、という辺りで kinaba さんに誰かこれ一緒に解決しませんか、と誘われたので下の問題を調査開始。

http://d.puremagic.com/issues/show_bug.cgi?id=5184

通らないとまずそうなものが、パースエラーになるという問題。見つかった経緯は→ http://twitter.com/#!/kinaba/status/56743445779316736

以下まとめ。

Type.staticMemberFunctionTemplate() みたいな static な関数テンプレートの呼び出しの式からは、

みたいツリーが作られます。
これが、式の型を決定したり、あと何か色々(色々ってなんだ・・・)する semantic という処理で、

<var var=staticMemberFunctionTemplate />

みたいに変形されます。
このカンマはいったい何、ということなのですが、 副作用を伴うような式をちゃんと評価させるためのもの?(fun().sfuntemp() みたいに書ける)
しかし、今そこにあるのは型なわけで、これではまずい。それでも return Type.staticMemberFunctionTemplate() みたいなのはちゃんと書けています。何故かな??
これはまだもう一回ツリーの変形が残されているからです。optimize という、それ通すか通さないかで式が valid かどうか変わるっておかしくないか…?という処理で、型のような中間表現に変換できないものは取り除かれている(エー!)らしく…
色々ありましたが最終的には、

<var var=staticMemberFunctionTemplate />

みたいになる。めでたしめでたし…

ところが return ではなく throw だと optimize が行われないので、型は取り除かれず、そのまま中間表現に変換しようとしてしまい、そこでエラーになる。なんともまあ…

じゃあ throw ... でも optimize すれば、となるわけですが、とはいえ何をしてくれるのかよくわからない optimize を行うことで、また何かおかしくなっても困ります。
そもそも型の場合にはカンマ区切りの式に変換しなければいいじゃない、ということでパッチはそうなっています。

ちなみに実際には Type.staticMemberFunctionTemplate() とかは引数がないことで型パラメタが推論できないから書けないですけど、例を簡単にするために省略してます。

そんなわけで、dmd のコードはそれなりに読めるレベルの汚さなので、皆さんどんどんハックするといいと思います。

おしまい。