summaryrefslogtreecommitdiffstats
path: root/codegen.sml
diff options
context:
space:
mode:
authorRose Hogenson <rhogenson@posteo.net>2023-02-12 15:37:25 -0800
committerRose Hogenson <rhogenson@posteo.net>2023-02-12 15:37:25 -0800
commitd940187fd8720e0ab3c00e5a6a7ae8f181c7752d (patch)
tree69df829ae1e7fb9454008920b49db08489d939a6 /codegen.sml
parent5989629a7951e544ad4656672025a99ecd08c7c9 (diff)
downloadsml-d940187fd8720e0ab3c00e5a6a7ae8f181c7752d.tar.zst
Add lambda functions.
Diffstat (limited to 'codegen.sml')
-rw-r--r--codegen.sml13
1 files changed, 8 insertions, 5 deletions
diff --git a/codegen.sml b/codegen.sml
index 1f6a2a8..84f3ad5 100644
--- a/codegen.sml
+++ b/codegen.sml
@@ -107,7 +107,10 @@ struct
fun toASM (expr : Syntax.cexp) : Syntax.opcode list =
let
val varMap = buildVarMap expr
- fun translate v = valOf (VarMap.lookup v varMap)
+ fun translate v =
+ case VarMap.lookup v varMap of
+ NONE => raise Fail ("unable to translate var " ^ Int.toString v)
+ | SOME x => x
fun translateVal (Syntax.VVar v) = Syntax.VVar (translate v)
| translateVal x = x
fun go expr =
@@ -126,12 +129,12 @@ struct
in rev (Syntax.OPoke (i, translate res, temp) :: ops)
end)
(enumerate args))
- @ toASM k
- | Syntax.CSelect (i, arg, res, k) => Syntax.OPeek (translate res, i, translateVal arg) :: toASM k
- | Syntax.CApp (func, args) => shuffle (func :: args) @ [Syntax.OCall]
+ @ go k
+ | Syntax.CSelect (i, arg, res, k) => Syntax.OPeek (translate res, i, translateVal arg) :: go k
+ | Syntax.CApp (func, args) => shuffle (map translateVal (func :: args)) @ [Syntax.OCall]
| Syntax.CFix (funcs, body) =>
let
- val bodyASM = toASM body
+ val bodyASM = go body
val funcsASM =
foldl
(fn ((name, _, body), acc) =>