diff options
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 () |
