これからどうしようか…
インスタンス変数とかまで先週見ていただいたときの方針で実装したわけで、これで来週先生に報告したときに呆れられる|怒られる心配はなくなった(?)ので、他の事を考える。
懸念は二つくらい。(標準ライブラリとか構文とかを除いた型システムの本質的な話で)
- クラスの扱いをもうちょっとなんとかしたい
- 多相性が全然足りない件
とりあえず多相性の話は来週1番で先生と相談することにして(予習しておかないと)、クラスの取り扱いを考える。
手元にあるのが、TAPLとRemyのObjectiveMLの論文*1なので、その辺を眺めることに。
まず、TAPLのFeatherweight Javaを見ると、こっちはSubtypingの例として出てきていることもあって、普通にnominalに取り扱ってるみたい。残念ながら、参考にはならない気がする。(structuralに扱いたいので)*2
一方ObjectiveMLでは、クラスは
γ ::= sig(τ) π end | τ→γ π ::= φ | π; field u : τ | π; method m : τ | ... σ ::= ... | ∀α.γ
などとして導入されている。これだけじゃあなんのことかわからないが、型つけ規則を見ると
(NEW) A├ c : sig (τy) π end τy = < method (π) > ------------------------------------------------------------- A├ new c : τy (CLASS-LET) A├ c : γ A + z : Gen(γ, A)├ a : τ ------------------------------------------------------------ A├ class z = c in a : τ
などと書いてあるので、特にクラスは考えずにstructuralに取り扱っていることがわかる。ふむ。別にクラスを考える必要はないのかなー。
しかし、(例えば)OCamlでどうやってるのかは気になるなあ。
*1:http://citeseer.ist.psu.edu/remy98objective.html
*2:ちなみに型つけ規則の書き方が参考になると思った。