let t_of_sexp k_of_sexp sexp =
let t = create 0 in
let sexps = match sexp with
| Sexp.Atom _ -> Conv.of_sexp_error
"Hash_set: found Atom where list was expected" sexp
| Sexp.List l -> l
in
List.iter sexps ~f:(fun k_sexp ->
let k = k_of_sexp k_sexp in
if mem t k then Conv.of_sexp_error "Hash_set: duplicate element found" k_sexp
else Hashtbl.add t ~key:k ~data:()
);
t