diff options
Diffstat (limited to 'cps.sml')
| -rw-r--r-- | cps.sml | 22 |
1 files changed, 19 insertions, 3 deletions
@@ -12,6 +12,20 @@ struct ([(fnName, [v, k], toCPS expr (fn ret => Syntax.CApp (Syntax.VVar k, [ret])))], cont (Syntax.VVar fnName)) end + | Syntax.LFix (decls, body) => + Syntax.CFix + ( map + (fn (name, arg, expr) => + let val w = Gensym.new () + in + ( name + , [arg, w] + , toCPS expr (fn z => Syntax.CApp (Syntax.VVar w, [z])) + ) + end) + decls + , toCPS body cont + ) | Syntax.LApp (Syntax.LPrim primop, Syntax.LRecord args) => let val temp = Gensym.new () @@ -130,9 +144,11 @@ struct | Syntax.CSelect (i, arg, res, k) => Syntax.CSelect (i, translateValue arg, res, convertExpr varMap k) | Syntax.CApp (func, args) => - let val temp = Gensym.new () - in Syntax.CSelect (0, translateValue func, temp, - Syntax.CApp (Syntax.VVar temp, map translateValue args)) + let + val temp = Gensym.new () + val f = translateValue func + in Syntax.CSelect (0, f, temp, + Syntax.CApp (Syntax.VVar temp, f :: map translateValue args)) end | Syntax.CFix (funcs, body) => let |
