let rec change_data_in_exp do_data_rec exp =
let do_exp = change_data_in_exp do_data_rec in
let do_data d = do_data_rec do_exp d in
match exp with
| Tconst c -> e_cnst c
| Tvar v -> e_var v
| Tdata d -> e_data (do_data d)
| Tapp (n,tl) -> e_app n (List.map (do_exp) tl)
| Tif (t1,t2,t3) -> e_if (do_exp t1) (do_exp t2) (do_exp t3)
| Tlet (x,v,t) -> e_let x (do_exp v) (do_exp t)