summaryrefslogtreecommitdiffstats
path: root/elab.sml
diff options
context:
space:
mode:
Diffstat (limited to 'elab.sml')
-rw-r--r--elab.sml12
1 files changed, 12 insertions, 0 deletions
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 ()