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