@@ -53,15 +53,15 @@ let rec tr_expr env (e : S.expr) =
5353 tr_expr env e2
5454
5555 | ELetRec (defs , body ) ->
56- let defs = tr_rec_defs env defs in
57- T. ELetRec (defs, tr_expr env body)
56+ let ^ () = tr_let_rec env defs in
57+ tr_expr env body
5858
5959 | ERecCtx e ->
6060 T. ERecCtx (tr_expr env e)
6161
6262 | EData (dds , e ) ->
63- let ( env, dds) = DataType. tr_data_defs env dds in
64- T. EData (dds, tr_expr env e)
63+ let ^ env = tr_data_defs env dds in
64+ tr_expr env e
6565
6666 | ECtor (prf , idx , tps , args ) ->
6767 let prf = tr_expr env prf in
@@ -99,6 +99,15 @@ and tr_let_expr ~pure x env (e : S.expr) cont =
9999 | ERepl _ | EReplExpr _ ->
100100 T. ELet (x, tr_expr env e, cont () )
101101
102+ (* * Translate let-rec definitions *)
103+ and tr_let_rec env defs cont =
104+ T. ELetRec (tr_rec_defs env defs, cont () )
105+
106+ (* * Translate local data definitions *)
107+ and tr_data_defs env dds cont =
108+ let (env, dds) = DataType. tr_data_defs env dds in
109+ T. EData (dds, cont env)
110+
102111and tr_expr_as_var env e =
103112 let x = Var. fresh () in
104113 let * () = tr_let_expr ~pure: false x env e in
@@ -129,18 +138,16 @@ and tr_expr_p env (e : S.expr) =
129138 tr_expr_p env e2
130139
131140 | ELetRec (defs , body ) ->
132- let defs = tr_rec_defs env defs in
133- let * body = tr_expr_p env body in
134- return (T. ELetRec (defs, body))
141+ let * () = tr_let_rec env defs in
142+ tr_expr_p env body
135143
136144 | ERecCtx e ->
137145 let * e = tr_expr_p env e in
138146 return (T. ERecCtx e)
139147
140148 | EData (dds , e ) ->
141- let (env, dds) = DataType. tr_data_defs env dds in
142- let * e = tr_expr_p env e in
143- return (T. EData (dds, e))
149+ let * env = tr_data_defs env dds in
150+ tr_expr_p env e
144151
145152 | ECtor (prf , idx , tps , args ) ->
146153 let prf = tr_expr env prf in
0 commit comments