ocaml_datatype_polymorphic-variant.md

# (* preparation *);;
# open Kxclib;;
# open Doctests_utils.Test_utils;;

simple polymorphic variant type : int_or_string

# open Bindoj.Type_desc;;
# open Bindoj.Caml_gen;;
# open Bindoj.Caml_gen.Datatype;;

# let int_or_string_desc =
    variant_decl "int_or_string" [
      variant_constructor "int" (`tuple_like [variant_argument @@ Coretype.mk_prim `int]);
      variant_constructor "string" (`tuple_like [variant_argument @@ Coretype.mk_prim `string]);
    ] ~configs:[
      Caml_config.variant_type `polymorphic
    ];;
val int_or_string_desc : type_decl =
  {td_name = "int_or_string";
   td_configs =
    Bindoj.Type_desc.Configs.(::)
     (Bindoj_typedesc.Type_desc.Config_caml_variant_type `polymorphic,
      Bindoj.Type_desc.Configs.[]);
   td_kind =
    Variant_decl
     [{vc_name = "int";
       vc_param =
        `tuple_like
          [{va_type =
             `direct
               {Bindoj.Type_desc.Coretype.ct_desc =
                 Bindoj.Type_desc.Coretype.Prim `int;
                ct_configs = Bindoj_typedesc.Type_desc.Configs.[]};
            va_configs = Bindoj.Type_desc.Configs.[]; va_doc = `nodoc}];
       vc_configs = Bindoj.Type_desc.Configs.[]; vc_doc = `nodoc};
      {vc_name = "string";
       vc_param =
        `tuple_like
          [{va_type =
             `direct
               {Bindoj.Type_desc.Coretype.ct_desc =
                 Bindoj.Type_desc.Coretype.Prim `string;
                ct_configs = Bindoj_typedesc.Type_desc.Configs.[]};
            va_configs = Bindoj.Type_desc.Configs.[]; va_doc = `nodoc}];
       vc_configs = Bindoj.Type_desc.Configs.[]; vc_doc = `nodoc}];
   td_doc = `nodoc}

# Bindoj.(
   let int_or_string_decl = Caml_gen.Datatype.type_declaration_of_type_decl int_or_string_desc in
   Caml.Structure.([declaration int_or_string_decl] |> printf "%a@?" pp_caml));;
type int_or_string = [ `int of int  | `string of string ]
- : unit = ()