let rec do_export f d =
  export_depends_for_item f d.d_item ;
  if not (Mset.mem d.d_name !exported_macros) then
    ( f d ; exported_macros := Mset.add d.d_name !exported_macros )

and export_depends_for_item f = function
  | Type _ | Cons _ | Function _ | Predicate _ | Trecord _ | Axiom _ -> ()
  | FunctionDef(_,_,exp) -> export_depends_for_term f exp
  | PredicateDef(_,prop) -> export_depends_for_pred f prop

and export_depends_for_name f x =
  try
    let d = Hashtbl.find gindex x in
    if is_macro d then do_export f d
  with Not_found -> ()
      
and export_depends_for_term f = function
  | Tconst _ | Tvar _ -> ()
  | Tapp(x,ts) -> 
      export_depends_for_name f x ; 
      List.iter (export_depends_for_term f) ts
  | Tgetfield(_,t) -> 
      export_depends_for_term f t
  | Tsetfield(_,t,v) | Taccess(t,v) | Tlet(_,t,v) -> 
      export_depends_for_term f t ; 
      export_depends_for_term f v
  | Tupdate(t,v,w) | Tif(t,v,w) -> 
      export_depends_for_term f t ; 
      export_depends_for_term f v ;
      export_depends_for_term f w

and export_depends_for_pred f = function
  | Papp(x,ts) -> 
      export_depends_for_name f x ; 
      List.iter (export_depends_for_term f) ts
  | Ptrue | Pfalse -> ()
  | Pimplies(p,q) | Pand(p,q) | Por(p,q) | Piff(p,q) ->
      export_depends_for_pred f p ;
      export_depends_for_pred f q
  | Pif(c,p,q) ->
      export_depends_for_term f c ;
      export_depends_for_pred f p ;
      export_depends_for_pred f q
  | Pnot p | Pnamed(_,p) | Pexists(_,p) | Pforall(_,p) ->
      export_depends_for_pred f p
  | Plet(_,t,p) ->
      export_depends_for_term f t ;
      export_depends_for_pred f p