diff options
| author | Rose Hogenson <rosehogenson@posteo.net> | 2024-04-27 10:19:54 -0700 |
|---|---|---|
| committer | Rose Hogenson <rosehogenson@posteo.net> | 2024-05-04 15:23:59 -0700 |
| commit | 8ea9fc2536aa0eb45092ed3654dba19b0c8e7c20 (patch) | |
| tree | 4c11670239a6722836891f5750098c7582a44011 /elab.sml | |
| parent | Add case over int. (diff) | |
| download | sml-8ea9fc2536aa0eb45092ed3654dba19b0c8e7c20.tar.zst | |
Implement recursive functions.
Diffstat (limited to 'elab.sml')
| -rw-r--r-- | elab.sml | 12 |
1 files changed, 12 insertions, 0 deletions
@@ -34,6 +34,18 @@ struct | Syntax.ELet ([], body) => elab env body | Syntax.ELet (Syntax.DVal (pat, v) :: decls, body) => elab env (Syntax.ECase (v, [(pat, Syntax.ELet (decls, body))])) + | Syntax.ELet (Syntax.DValRec (Syntax.PVar name, f as Syntax.ELambda _) :: decls, body) => + let + val n = Gensym.new () + val env' = StringMap.insert name n env + val (arg, fnBody) = + case elab env' f of + Syntax.LFn x => x + | _ => raise Fail "Syntax.ELambda should expand to Syntax.LFn" + in + Syntax.LFix ([(n, arg, fnBody)], elab env' (Syntax.ELet (decls, body))) + end + | Syntax.ELet (Syntax.DValRec _ :: _, _) => raise Fail "invalid val rec" | Syntax.ELambda (pat, body) => let val v = Gensym.new () |
