Type system
授業の課題で Jaう゛ぁを使わなくてよくなったのはいいんだけど、OCaml は OCaml でよくわからん。具体的に何かというと、またもや interpreter を書いてるんですが、rudimentary な call-by-need を実装せよと指定されているので、interpret されてる (OCaml じゃない) 方の世界からは見えない promise を実装してるんですな、これが (一般には suspension というらしいが)。で、
type value = (* 整数とか閉包とか、interpret される言語での型諸々 *) and promise_impl = { expr:exp; uenv:environment; } and maybe_value = Value of value | Promise of promise and promise = { mutable cell:maybe_value; } and binding = { sym:symbol; valu:promise; }
としてるけど、何か釈然としない。何で
promise = { mutable value:(Value value | Promise promise_impl); }
とか、もっと言えば
maybe_value = (Value of value | Promise of promise) ref
とかできないのか? 実装側からすれば特に都合悪そうな感じはしないんだけど。Anonymous でええやん。名前考えんのめんどいって。まさか構造体の使いどころ間違ってるとか?
追記: む、これは self-destructive な関数を promise_impl にすれば済むんだった。C で sigscheme 書いてたときの癖がついてしまっとる。
そしてもう一つ。promise_impl が閉じ込めてる環境の名前が *u*env になってるけど、これは閉包をあらわす構造体のもつ環境が既に env という名前を取ってるからなんですな。Pattern matching で名前の競合がまずいのはわかるけど、型注釈で回避とかでいいじゃないですか。何で全面禁止?