blob: 6a807152f74fca7bb11946c82a6527cced33201d (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
structure Elab =
struct
fun primop (s : string) : Syntax.primop =
case s of
"exit" => Syntax.PExit
| _ => raise Fail ("invalid op: " ^ s)
fun elaborate (p : Syntax.expr) : Syntax.lexp =
case p of
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]))
| Syntax.ELambda e => Syntax.LFn (Gensym.new (), elaborate e)
end
|