-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuntyped-util.sml
25 lines (22 loc) · 1007 Bytes
/
untyped-util.sml
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
structure UntypedUtil :> UNTYPED_UTIL =
struct
structure L = MinMLUntyped
fun termToString exp =
case exp of
L.EVar (k, s) => s ^ "[" ^ Int.toString k ^ "]"
| L.EApp (e1, e2) => parensTerm e1 ^ parensTerm e2
| L.ELam e => "lam" ^ parensTerm e
| L.EFix e => "fix" ^ parensTerm e
| L.ELet (e1, e2) => "let(" ^ termToString e1 ^ ", " ^ termToString e2 ^ ")"
| L.EUnit => "()"
| L.EPair (e1, e2) => "<" ^ termToString e1 ^ ", " ^ termToString e2 ^ ">"
| L.EFst e => "fst" ^ parensTerm e
| L.ESnd e => "snd" ^ parensTerm e
| L.EInl e => "inl" ^ parensTerm e
| L.EInr e => "inr" ^ parensTerm e
| L.ECase (e, eLeft, eRight) =>
"case(" ^ termToString e ^ ", " ^ termToString eLeft ^ ", " ^ termToString eRight ^ ")"
| L.ERollList e => "roll(" ^ termToString e ^ ")"
| L.EUnrollList e => "unroll(" ^ termToString e ^ ")"
and parensTerm exp = "(" ^ termToString exp ^ ")"
end