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