let rec change_in_exp do_var do_data exp =
  let frec = change_in_exp do_var do_data in
  match exp with
  | Tconst c -> e_cnst c
  | Tvar v -> (match do_var v with Some e -> e | None -> e_var v)
  | Tdata d -> do_data d
  | Tapp (n,tl) -> e_app n (List.map (frec) tl)
  | Tif (t1,t2,t3) -> e_if (frec t1) (frec t2) (frec t3)
  | Tlet (x,v,t) -> e_let x (frec v) (frec t)