summaryrefslogtreecommitdiffstats
path: root/elab.sml
diff options
context:
space:
mode:
Diffstat (limited to 'elab.sml')
-rw-r--r--elab.sml15
1 files changed, 12 insertions, 3 deletions
diff --git a/elab.sml b/elab.sml
index 0838f38..6a80715 100644
--- a/elab.sml
+++ b/elab.sml
@@ -7,16 +7,25 @@ struct
fun elaborate (p : Syntax.expr) : Syntax.lexp =
case p of
- Syntax.EBuiltin builtin => Syntax.LPrim (primop builtin)
- | Syntax.EIdent [i] => raise Fail "only primitive operations for now, no variables"
+ Syntax.EIdent [i] => raise Fail "only primitive operations for now, no variables"
+ | Syntax.EIdent _ => raise Fail "long identifiers are not supported"
+ | Syntax.EBuiltin builtin => Syntax.LPrim (primop builtin)
| Syntax.EInt i => Syntax.LInt i
| Syntax.EStr s => Syntax.LString s
| Syntax.ETuple exprs => Syntax.LRecord (map elaborate exprs)
+ | Syntax.EList exprs =>
+ foldr
+ (fn (x, acc) =>
+ Syntax.LRecord [elaborate x, acc])
+ (Syntax.LInt 0)
+ exprs
| Syntax.EApp (f, x) => Syntax.LApp (elaborate f, elaborate x)
| Syntax.ETyped (e, _) => elaborate e
+ | Syntax.EAndAlso (_, _) => raise Fail "unimplemented"
+ | Syntax.EOrElse (_, _) => raise Fail "unimplemented"
| Syntax.ELet (decls, body) =>
Syntax.LRecord
(map elaborate
(map (fn (Syntax.DVal e) => e) decls @ [body]))
- | _ => raise Fail "elaborate: operation not supported"
+ | Syntax.ELambda e => Syntax.LFn (Gensym.new (), elaborate e)
end