diff options
| author | Rose Hogenson <rosehogenson@posteo.net> | 2024-04-07 09:11:28 -0700 |
|---|---|---|
| committer | Rose Hogenson <rosehogenson@posteo.net> | 2024-04-07 09:11:28 -0700 |
| commit | 278ee46f0fa93a3db4ebdc6878fcd9b1d990094a (patch) | |
| tree | 85cd7b4703cacea8111ea05766089ca73aac9abb /cps.sml | |
| parent | bc2fef3a2ab81270af207568706647ced919bbe6 (diff) | |
| download | sml-278ee46f0fa93a3db4ebdc6878fcd9b1d990094a.tar.zst | |
Add tests and fix variables.
Diffstat (limited to 'cps.sml')
| -rw-r--r-- | cps.sml | 13 |
1 files changed, 7 insertions, 6 deletions
@@ -61,17 +61,18 @@ struct fun hoist (expr : Syntax.cexp) : Syntax.cexp = let - fun funs (Syntax.CRecord (_, _, k)) acc = funs k acc - | funs (Syntax.CSelect (_, _, _, k)) acc = funs k acc - | funs (Syntax.CApp _) acc = acc - | funs (Syntax.CFix (fs, body)) acc = funs body (fs @ acc) - | funs (Syntax.CPrimop (_, _, _, ks)) acc = foldl (fn (x, acc) => funs x acc) acc ks - fun exprs (Syntax.CRecord (args, res, k)) = Syntax.CRecord (args, res, exprs k) | exprs (Syntax.CSelect (i, arg, res, k)) = Syntax.CSelect (i, arg, res, exprs k) | exprs (expr as Syntax.CApp _) = expr | exprs (Syntax.CFix (_, body)) = exprs body | exprs (Syntax.CPrimop (p, args, res, ks)) = Syntax.CPrimop (p, args, res, (map exprs ks)) + + fun funs (Syntax.CRecord (_, _, k)) acc = funs k acc + | funs (Syntax.CSelect (_, _, _, k)) acc = funs k acc + | funs (Syntax.CApp _) acc = acc + | funs (Syntax.CFix (fs, body)) acc = + funs body (foldl (fn ((fName, fVars, fBody), acc) => (fName, fVars, exprs fBody) :: funs fBody acc) acc fs) + | funs (Syntax.CPrimop (_, _, _, ks)) acc = foldl (fn (x, acc) => funs x acc) acc ks val entryPoint = Gensym.new () in Syntax.CFix ((entryPoint, [], exprs expr) :: funs expr [], Syntax.CApp (Syntax.VLabel entryPoint, [])) |
