let compile_and_define hdefs name data compiler definer =
    let cdata =
      try Hashtbl.find hdefs name with Not_found ->
        try
          let cdata = Some (compiler name data) in
          Hashtbl.add hdefs name cdata ; cdata
        with error ->
          Hashtbl.add hdefs name None ; raise error
    in match cdata with
      | None -> ()
      | Some data -> definer name data