幽霊型含む、カスタムのコンストラクターを書こうとすると名前空間の問題が出てくる
二重インクルードの問題とかもあるので、先に分割コンパイルの仕組みを整える方がいい?
型の環境の中に変数解決が必要になってくる
内部的には幽霊、Opaque、バリアントで分かれててもいいかもな
enum Variant{<!-- line:15 -->
Phantom(Symbol),<!-- line:16 -->
Opaque(Symbol,TypeNodeId),<!-- line:17 -->
Union(Box<Self>,Box<Self>)<!-- line:18 -->
}<!-- line:19 -->
enum Type{<!-- line:20 -->
...<!-- line:21 -->
<!-- line:22 -->
Variant(Variant)<!-- line:23 -->
}<!-- line:24 -->FoldでネストするくらいならVec<Box<Self>>に収められるかな?
パーサーとASTとしてはmatch節も加えないと意味ない
で、型推論に加えなきゃいけないコードは、
- 型コンストラクタを関数として使えるように型→値環境に追加し、App式の評価で使えるように
- match式の型推論
matchのコード生成がジャンプテーブルとか出てくるとめんどくさいんだよなあ