use a structural type (poly variant) for Sexp.t