reorder generated variable in for_each

This commit is contained in:
Pierre-Emmanuel Wulfman 2020-04-23 18:01:07 +02:00
parent 30f2581f8b
commit 8dfc8a0469

View File

@ -552,13 +552,14 @@ and compile_for I.{binder;start;final;increment;body} =
ok @@ restore_mutable_variable return_expr captured_name_list env_rec ok @@ restore_mutable_variable return_expr captured_name_list env_rec
and compile_for_each I.{binder;collection;collection_type; body} = and compile_for_each I.{binder;collection;collection_type; body} =
let env_rec = Var.fresh () in
let args = Var.fresh () in let args = Var.fresh () in
let%bind element_names = ok @@ match snd binder with let%bind element_names = ok @@ match snd binder with
| Some v -> [fst binder;v] | Some v -> [fst binder;v]
| None -> [fst binder] | None -> [fst binder]
in in
let env = Var.fresh () in
let%bind body = compile_expression body in let%bind body = compile_expression body in
let%bind ((_,free_vars), body) = repair_mutable_variable_in_loops body element_names args in let%bind ((_,free_vars), body) = repair_mutable_variable_in_loops body element_names args in
let for_body = add_to_end body @@ (O.e_record_accessor (O.e_variable args) (Label "0")) in let for_body = add_to_end body @@ (O.e_record_accessor (O.e_variable args) (Label "0")) in
@ -582,9 +583,9 @@ and compile_for_each I.{binder;collection;collection_type; body} =
| Map -> ok @@ O.C_MAP_FOLD | Set -> ok @@ O.C_SET_FOLD | List -> ok @@ O.C_LIST_FOLD | Map -> ok @@ O.C_MAP_FOLD | Set -> ok @@ O.C_SET_FOLD | List -> ok @@ O.C_LIST_FOLD
in in
let fold = fun expr -> let fold = fun expr ->
O.e_let_in (env,None) false false (O.e_constant op_name [lambda; collect ; init_record]) expr O.e_let_in (env_rec,None) false false (O.e_constant op_name [lambda; collect ; init_record]) expr
in in
ok @@ restore_mutable_variable fold free_vars env ok @@ restore_mutable_variable fold free_vars env_rec
let compile_declaration : I.declaration Location.wrap -> _ = let compile_declaration : I.declaration Location.wrap -> _ =
fun {wrap_content=declaration;location} -> fun {wrap_content=declaration;location} ->