From 8ea9fc2536aa0eb45092ed3654dba19b0c8e7c20 Mon Sep 17 00:00:00 2001 From: Rose Hogenson Date: Sat, 27 Apr 2024 10:19:54 -0700 Subject: Implement recursive functions. --- elab.sml | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'elab.sml') diff --git a/elab.sml b/elab.sml index f6f2e38..af6bec2 100644 --- a/elab.sml +++ b/elab.sml @@ -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 () -- cgit v1.3.1