diff options
| author | Rose Hogenson <rhogenson@posteo.net> | 2023-02-12 15:37:25 -0800 |
|---|---|---|
| committer | Rose Hogenson <rhogenson@posteo.net> | 2023-02-12 15:37:25 -0800 |
| commit | d940187fd8720e0ab3c00e5a6a7ae8f181c7752d (patch) | |
| tree | 69df829ae1e7fb9454008920b49db08489d939a6 /codegen.sml | |
| parent | 5989629a7951e544ad4656672025a99ecd08c7c9 (diff) | |
| download | sml-d940187fd8720e0ab3c00e5a6a7ae8f181c7752d.tar.zst | |
Add lambda functions.
Diffstat (limited to 'codegen.sml')
| -rw-r--r-- | codegen.sml | 13 |
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) => |
