diff options
author | Adam Chlipala <adamc@hcoop.net> | 2009-09-17 16:35:11 -0400 |
---|---|---|
committer | Adam Chlipala <adamc@hcoop.net> | 2009-09-17 16:35:11 -0400 |
commit | ae83d3e44959b43c167ba83736055bf94ace3113 (patch) | |
tree | 9d7a2e3bc1dff89e7399d555415ffae5c45c8b52 /src/monoize.sml | |
parent | bf1a78ce9a5d60f8f4c40d0087f6caf90c10a796 (diff) |
Basic tail recursion introduction seems to be working
Diffstat (limited to 'src/monoize.sml')
-rw-r--r-- | src/monoize.sml | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/monoize.sml b/src/monoize.sml index 9a3858f8..83a520c8 100644 --- a/src/monoize.sml +++ b/src/monoize.sml @@ -3137,6 +3137,21 @@ fun monoExp (env, st, fm) (all as (e, loc)) = ((L'.ELet (x, t', e1, e2), loc), fm) end + | L.ETailCall (n, es, ek, _, (L.TRecord (L.CRecord (_, []), _), _)) => + let + val (es, fm) = ListUtil.foldlMap (fn (e, fm) => monoExp (env, st, fm) e) fm es + val (ek, fm) = monoExp (env, st, fm) ek + + val e = (L'.ENamed n, loc) + val e = foldl (fn (e, arg) => (L'.EApp (e, arg), loc)) e es + val e = (L'.EApp (e, ek), loc) + in + (e, fm) + end + | L.ETailCall _ => (E.errorAt loc "Full scope of tail call continuation isn't known"; + Print.eprefaces' [("Expression", CorePrint.p_exp env all)]; + (dummyExp, fm)) + | L.EServerCall (n, es, ek, t, (L.TRecord (L.CRecord (_, []), _), _)) => let val t = monoType env t |