let rec change_in_exp do_var exp =
  let frec = change_in_exp do_var in
  match exp with
  | Tconst c -> e_cnst c
  | Tvar v -> (match do_var v with Some e -> e | None -> e_var v)
  | Tgetfield(f,r) -> e_getfield f (frec r)
  | Tsetfield(f,r,v) -> e_setfield f (frec r) (frec v)
  | Taccess(t,i) -> e_access (frec t) (frec i)
  | Tupdate(t,i,v) -> e_update (frec t) (frec i) (frec v)
  | 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)