-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathtranslation__fun_to_fun_a.ml
33 lines (28 loc) · 1.01 KB
/
translation__fun_to_fun_a.ml
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
32
33
(** {0 Alpha-renaming translation}
This translation assigns unique names to each variable binding as a way to
simplify later compilation passes.
*)
module Fun = Lang.Fun
module Fun_a = Lang.Fun_a
(** {1 Translation} *)
let rec translate env : Fun.tm -> Fun_a.tm =
function
| Var index -> Var (List.nth env index)
| Let (def_name, def_ty, def, body) ->
let def_var = Fun_a.Var.fresh def_name in
let def = translate env def in
let body = translate (def_var :: env) body in
Let (def_var, def_ty, def, body)
| Bool_lit b -> Bool_lit b
| Int_lit i -> Int_lit i
| Prim_app (prim, args) ->
let args = List.map (translate env) args in
Prim_app (prim, args)
| Fun_lit (param_name, param_ty, body) ->
let param_var = Fun_a.Var.fresh param_name in
let body = translate (param_var :: env) body in
Fun_lit (param_var, param_ty, body)
| Fun_app (head, arg) ->
let head = translate env head in
let arg = translate env arg in
Fun_app (head, arg)