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)