diff options
| author | Rose Hogenson <rosehogenson@posteo.net> | 2024-02-07 21:08:35 -0800 |
|---|---|---|
| committer | Rose Hogenson <rosehogenson@posteo.net> | 2024-02-19 14:24:27 -0800 |
| commit | bc2fef3a2ab81270af207568706647ced919bbe6 (patch) | |
| tree | bbb63738ec94757ff65554bcc8bc6a4ab2cfdef9 /cps.sml | |
| parent | 1a25a5cc66c8ae48bfd5569da04e9cfc8f9c3501 (diff) | |
| download | sml-bc2fef3a2ab81270af207568706647ced919bbe6.tar.zst | |
Support function arguments.
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 |
