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)