途中経過メモ

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がよく分からない問題も解決。