summaryrefslogtreecommitdiffstats
path: root/cps.sml
diff options
context:
space:
mode:
authorRose Hogenson <rosehogenson@posteo.net>2024-02-07 21:08:35 -0800
committerRose Hogenson <rosehogenson@posteo.net>2024-02-19 14:24:27 -0800
commitbc2fef3a2ab81270af207568706647ced919bbe6 (patch)
treebbb63738ec94757ff65554bcc8bc6a4ab2cfdef9 /cps.sml
parent1a25a5cc66c8ae48bfd5569da04e9cfc8f9c3501 (diff)
downloadsml-bc2fef3a2ab81270af207568706647ced919bbe6.tar.zst
Support function arguments.
Diffstat (limited to 'cps.sml')
-rw-r--r--cps.sml22
1 files changed, 19 insertions, 3 deletions
diff --git a/cps.sml b/cps.sml
index 6854545..56780a9 100644
--- a/cps.sml
+++ b/cps.sml
@@ -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