Ex.6.2 を進めました。
pprintAnn 関数(下請け関数群を含む)と、とりあえず注釈処理用に iSet :: Set Name -> Iseq という関数を定義して、
以下のテストプログラム
f x = let
g = \y. x*x + y
in
(g 3 + g 4) ;
main = f 6
を parse して freeVarse した結果
[("f",["x"],(["x"],ALet False [("g",(["x"],ALam ["y"] (["x","y"],AAp (["x"],AAp ([],AVar "+") (["x"],AAp (["x"],AAp ([],AVar "*") (["x"],AVar "x")) (["x"],AVar "x"))) (["y"],AVar "y"))))] (["g"],AAp (["g"],AAp ([],AVar "+") (["g"],AAp (["g"],AVar "g") ([],ANum 3))) (["g"],AAp (["g"],AVar "g") ([],ANum 4))))),("main",[],([],AAp ([],AVar "f") ([],ANum 6)))]
を処理してみたところ、以下の様に表示されました。
f x = [x](let
g = [x](\y. [x,y]([x]([](+) ([x]([x]([](*) [x](x)) [x](x)))) [y](y)))
in [g]([g]([](+) ([g]([g](g) [](3)))) ([g]([g](g) [](4))))) ;
main = []([](f) [](6))
"+" や "*" は中置表記をやめて前置表記にしてみました。それでも、結構見づらいです。
はたして、これでいいのかどうかは、自分にとってはまだ不明です。あと case 式は未対応です。