Skip to content

Commit 4699d9a

Browse files
authored
Fixed scoping issues in translation to Core (#305)
Fixes #302
1 parent 8b8a668 commit 4699d9a

File tree

3 files changed

+20
-10
lines changed

3 files changed

+20
-10
lines changed

src/ToCore/Main.ml

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
102111
and 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

test/ok/ok0149_localLetRec.fram

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
let (_ : Int) = (let rec iter i j = 13 in iter 42) 0

test/ok/ok0150_localData.fram

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
let foo _ _ = 42
2+
let (_ : Int) = (data T = C in foo C) 0

0 commit comments

Comments
 (0)