途中経過メモ
reconctructionまで書いた。何気に、きちんと書くと分量多いな。つって、全部併せても1000行いかなそうだけど。単にやる気がないだけ。derivationしか考えずに書き始めたので色々まずかった。TermとHyloFormと分けたけど、(OnoueのD論でそうなってるように)やっぱ一緒にしないと具合が悪い。結局、Termの定義はこんな感じに。HyloFormはなくなった
data Term = Var String -- variable | Lit Literal -- literal | Tuples [Term] | Lam Args Term | Let String Term Term | Case Term [(Pat,Term)] | FApp String [Term] | CApp String [Term] -- constructor application | App Term Term -- application(general) | Juncs [Term] -- junc | Plus [Term] | Hylo Term Term Term | Tags (Int , Term) deriving (Eq,Show)
GHC CoreのSyntaxが
data Expr b = Var Id | Lit Literal | App (Expr b) (Arg b) | Lam b (Expr b) | Let (Bind b) (Expr b) | Case (Expr b) b [Alt b] | Note Note (Expr b) | Type Type
なので、なるべく、JuncsとかHyloとか追い出したかったけど、HyloFusionする時だけ、一旦ExprをTermに埋めこんでしまえばいいかと思い直した。今、再帰変数の判定を名前でやってるけど、それもどうかなぁといういう気がする。
gensymみたいな便利系関数は、Haskellにはないっぽい。まあ、むしろ、LispとかSchemeが珍しい部類な気もするけど。GHC見ると、なんかきちんとモナド使ってグネグネやってるっぽかった。私は堕落してるので、unsafePerformIOとかで誤魔化していく。Schemeで書く案もあったけど、Haskellの勉強ということで正当化(単に書き直すのが面倒なだけ)
Case式の平坦化が謎。もうちょっとよく考える
ほんで、パーサだよ。いつまでも、Lam (Vars ["x" , "y"]) ...とか書いてるのもださ(る)いし。しかし、Haskellの構文をフルにサポートしようとするとこれは大変そうだし。GHC Coreが独自のきもい構文使わず、deriving Showとかで手抜きしていれば、それそのまま利用できたのに、GHCめ!まあ、S式でいいかな〜。(lambda (x y) (case x (...)))みたいな感じのが適当にグネグネされる感じで。Parsecで書いたS式パーサとか探せば落ちてそうだし、Parsecがよく分からない問題も解決。