aboutsummaryrefslogtreecommitdiff
path: root/dev/top_printers.ml
diff options
context:
space:
mode:
Diffstat (limited to 'dev/top_printers.ml')
-rw-r--r--dev/top_printers.ml585
1 files changed, 585 insertions, 0 deletions
diff --git a/dev/top_printers.ml b/dev/top_printers.ml
new file mode 100644
index 0000000000..74be300134
--- /dev/null
+++ b/dev/top_printers.ml
@@ -0,0 +1,585 @@
+(************************************************************************)
+(* * The Coq Proof Assistant / The Coq Development Team *)
+(* v * INRIA, CNRS and contributors - Copyright 1999-2018 *)
+(* <O___,, * (see CREDITS file for the list of authors) *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(* * (see LICENSE file for the text of the license) *)
+(************************************************************************)
+
+(* Printers for the ocaml toplevel. *)
+
+open Sorts
+open Util
+open Pp
+open Names
+open Libnames
+open Globnames
+open Univ
+open Environ
+open Printer
+open Constr
+open Context
+open Genarg
+open Clenv
+
+let _ = Detyping.print_evar_arguments := true
+let _ = Detyping.print_universes := true
+let _ = Goptions.set_bool_option_value ["Printing";"Matching"] false
+let _ = Detyping.set_detype_anonymous (fun ?loc _ -> raise Not_found)
+
+(* std_ppcmds *)
+let pp x = Pp.pp_with !Topfmt.std_ft x
+
+(** Future printer *)
+
+let ppfuture kx = pp (Future.print (fun _ -> str "_") kx)
+
+(* name printers *)
+let ppid id = pp (Id.print id)
+let pplab l = pp (Label.print l)
+let ppmbid mbid = pp (str (MBId.debug_to_string mbid))
+let ppdir dir = pp (DirPath.print dir)
+let ppmp mp = pp(str (ModPath.debug_to_string mp))
+let ppcon con = pp(Constant.debug_print con)
+let ppproj con = pp(Constant.debug_print (Projection.constant con))
+let ppkn kn = pp(str (KerName.to_string kn))
+let ppmind kn = pp(MutInd.debug_print kn)
+let ppind (kn,i) = pp(MutInd.debug_print kn ++ str"," ++int i)
+let ppsp sp = pp(pr_path sp)
+let ppqualid qid = pp(pr_qualid qid)
+let ppclindex cl = pp(Classops.pr_cl_index cl)
+let ppscheme k = pp (Ind_tables.pr_scheme_kind k)
+
+let prrecarg = function
+ | Declarations.Norec -> str "Norec"
+ | Declarations.Mrec (mind,i) ->
+ str "Mrec[" ++ MutInd.print mind ++ pr_comma () ++ int i ++ str "]"
+ | Declarations.Imbr (mind,i) ->
+ str "Imbr[" ++ MutInd.print mind ++ pr_comma () ++ int i ++ str "]"
+let ppwf_paths x = pp (Rtree.pp_tree prrecarg x)
+
+let get_current_context () =
+ try Vernacstate.Proof_global.get_current_context ()
+ with Vernacstate.Proof_global.NoCurrentProof ->
+ let env = Global.env() in
+ Evd.from_env env, env
+
+(* term printers *)
+let envpp pp = let sigma,env = get_current_context () in pp env sigma
+let rawdebug = ref false
+let ppevar evk = pp (Evar.print evk)
+let pr_constr t =
+ let sigma, env = get_current_context () in
+ Printer.pr_constr_env env sigma t
+let pr_econstr t =
+ let sigma, env = get_current_context () in
+ Printer.pr_econstr_env env sigma t
+let ppconstr x = pp (pr_constr x)
+let ppeconstr x = pp (pr_econstr x)
+let ppconstr_expr x = let sigma,env = get_current_context () in pp (Ppconstr.pr_constr_expr env sigma x)
+let ppsconstr x = ppconstr (Mod_subst.force_constr x)
+let ppconstr_univ x = Constrextern.with_universes ppconstr x
+let ppglob_constr = (fun x -> pp(pr_lglob_constr_env (Global.env()) x))
+let pppattern = (fun x -> pp(envpp pr_constr_pattern_env x))
+let pptype = (fun x -> try pp(envpp pr_ltype_env x) with e -> pp (str (Printexc.to_string e)))
+let ppfconstr c = ppconstr (CClosure.term_of_fconstr c)
+
+let ppbigint n = pp (str (Bigint.to_string n));;
+
+let prset pr l = str "[" ++ hov 0 (prlist_with_sep spc pr l) ++ str "]"
+let ppintset l = pp (prset int (Int.Set.elements l))
+let ppidset l = pp (prset Id.print (Id.Set.elements l))
+
+let prset' pr l = str "[" ++ hov 0 (prlist_with_sep pr_comma pr l) ++ str "]"
+
+let pridmap pr l =
+ let pr (id,b) = Id.print id ++ str "=>" ++ pr id b in
+ prset' pr (Id.Map.fold (fun a b l -> (a,b)::l) l [])
+let ppidmap pr l = pp (pridmap pr l)
+
+let pridmapgen l =
+ let dom = Id.Set.elements (Id.Map.domain l) in
+ if dom = [] then str "[]" else
+ str "[domain= " ++ hov 0 (prlist_with_sep spc Id.print dom) ++ str "]"
+let ppidmapgen l = pp (pridmapgen l)
+
+let ppevarsubst = ppidmap (fun id0 -> prset (fun (c,copt,id) ->
+ hov 0
+ (pr_constr c ++
+ (match copt with None -> mt () | Some c -> spc () ++ str "<expanded: " ++
+ pr_constr c ++ str">") ++
+ (if id = id0 then mt ()
+ else spc () ++ str "<canonical: " ++ Id.print id ++ str ">"))))
+
+let prididmap = pridmap (fun _ -> Id.print)
+let ppididmap = ppidmap (fun _ -> Id.print)
+
+let prconstrunderbindersidmap = pridmap (fun _ (l,c) ->
+ hov 1 (str"[" ++ prlist_with_sep spc Id.print l ++ str"]")
+ ++ str "," ++ spc () ++ pr_econstr c)
+
+let ppconstrunderbindersidmap l = pp (prconstrunderbindersidmap l)
+
+let ppunbound_ltac_var_map l = ppidmap (fun _ arg ->
+ str"<genarg:" ++ pr_argument_type(genarg_tag arg) ++ str">") l
+
+open Ltac_pretype
+let rec pr_closure {idents=idents;typed=typed;untyped=untyped} =
+ hov 1 (str"{idents=" ++ prididmap idents ++ str";" ++ spc() ++
+ str"typed=" ++ prconstrunderbindersidmap typed ++ str";" ++ spc() ++
+ str"untyped=" ++ pr_closed_glob_constr_idmap untyped ++ str"}")
+and pr_closed_glob_constr_idmap x =
+ pridmap (fun _ -> pr_closed_glob_constr) x
+and pr_closed_glob_constr {closure=closure;term=term} =
+ pr_closure closure ++ (pr_lglob_constr_env Global.(env ())) term
+
+let ppclosure x = pp (pr_closure x)
+let ppclosedglobconstr x = pp (pr_closed_glob_constr x)
+let ppclosedglobconstridmap x = pp (pr_closed_glob_constr_idmap x)
+
+let pP s = pp (hov 0 s)
+
+let safe_pr_global = function
+ | ConstRef kn -> pp (str "CONSTREF(" ++ Constant.debug_print kn ++ str ")")
+ | IndRef (kn,i) -> pp (str "INDREF(" ++ MutInd.debug_print kn ++ str "," ++
+ int i ++ str ")")
+ | ConstructRef ((kn,i),j) -> pp (str "CONSTRUCTREF(" ++ MutInd.debug_print kn ++ str "," ++
+ int i ++ str "," ++ int j ++ str ")")
+ | VarRef id -> pp (str "VARREF(" ++ Id.print id ++ str ")")
+
+let ppglobal x = try pp(pr_global x) with _ -> safe_pr_global x
+
+let ppconst (sp,j) =
+ pp (str"#" ++ KerName.print sp ++ str"=" ++ envpp pr_lconstr_env j.uj_val)
+
+let ppvar ((id,a)) =
+ pp (str"#" ++ Id.print id ++ str":" ++ envpp pr_lconstr_env a)
+
+let genppj f j = let (c,t) = f j in (c ++ str " : " ++ t)
+
+let ppj j = pp (genppj (envpp pr_ljudge_env) j)
+
+let ppsubst s = pp (Mod_subst.debug_pr_subst s)
+let ppdelta s = pp (Mod_subst.debug_pr_delta s)
+
+let pp_idpred s = pp (pr_idpred s)
+let pp_cpred s = pp (pr_cpred s)
+let pp_transparent_state s = pp (pr_transparent_state s)
+let pp_stack_t n = pp (Reductionops.Stack.pr (EConstr.of_constr %> pr_econstr) n)
+let pp_cst_stack_t n = pp (Reductionops.Cst_stack.pr Global.(env()) Evd.empty n)
+let pp_state_t n = pp (Reductionops.pr_state Global.(env()) Evd.empty n)
+
+(* proof printers *)
+let pr_evar ev = Pp.int (Evar.repr ev)
+let ppmetas metas = pp(Termops.pr_metaset metas)
+let ppevm evd = pp(Termops.pr_evar_map ~with_univs:!Detyping.print_universes (Some 2) (Global.env ()) evd)
+let ppevmall evd = pp(Termops.pr_evar_map ~with_univs:!Detyping.print_universes None (Global.env ()) evd)
+let pr_existentialset evars =
+ prlist_with_sep spc pr_evar (Evar.Set.elements evars)
+let ppexistentialset evars =
+ pp (pr_existentialset evars)
+let ppexistentialfilter filter = match Evd.Filter.repr filter with
+| None -> pp (Pp.str "ΓΈ")
+| Some f -> pp (prlist_with_sep spc bool f)
+let ppclenv clenv = pp(pr_clenv clenv)
+let ppgoalgoal gl = pp(Goal.pr_goal gl)
+let ppgoal g = pp(Printer.pr_goal g)
+let ppgoalsigma g = pp(Printer.pr_goal g ++ Termops.pr_evar_map None (Global.env ()) (Refiner.project g))
+let pphintdb db = pp(envpp Hints.pr_hint_db_env db)
+let ppproofview p =
+ let gls,sigma = Proofview.proofview p in
+ pp(pr_enum Goal.pr_goal gls ++ fnl () ++ Termops.pr_evar_map (Some 1) (Global.env ()) sigma)
+
+let ppopenconstr (x : Evd.open_constr) =
+ let (evd,c) = x in pp (Termops.pr_evar_map (Some 2) (Global.env ()) evd ++ envpp pr_econstr_env c)
+(* spiwack: deactivated until a replacement is found
+let pppftreestate p = pp(print_pftreestate p)
+*)
+
+(* let ppgoal g = pp(db_pr_goal g) *)
+(* let pr_gls gls = *)
+(* hov 0 (pr_evar_defs (sig_sig gls) ++ fnl () ++ db_pr_goal (sig_it gls)) *)
+
+(* let pr_glls glls = *)
+(* hov 0 (pr_evar_defs (sig_sig glls) ++ fnl () ++ *)
+(* prlist_with_sep fnl db_pr_goal (sig_it glls)) *)
+
+(* let ppsigmagoal g = pp(pr_goal (sig_it g)) *)
+(* let prgls gls = pp(pr_gls gls) *)
+(* let prglls glls = pp(pr_glls glls) *)
+
+let pproof p = pp(Proof.pr_proof p)
+
+let ppuni u = pp(Universe.pr u)
+let ppuni_level u = pp (Level.pr u)
+
+let prlev = UnivNames.pr_with_global_universes
+let ppuniverse_set l = pp (LSet.pr prlev l)
+let ppuniverse_instance l = pp (Instance.pr prlev l)
+let ppuniverse_context l = pp (pr_universe_context prlev l)
+let ppuniverse_context_set l = pp (pr_universe_context_set prlev l)
+let ppuniverse_subst l = pp (Univ.pr_universe_subst l)
+let ppuniverse_opt_subst l = pp (UnivSubst.pr_universe_opt_subst l)
+let ppuniverse_level_subst l = pp (Univ.pr_universe_level_subst l)
+let ppevar_universe_context l = pp (Termops.pr_evar_universe_context l)
+let ppconstraints c = pp (pr_constraints Level.pr c)
+let ppuniverseconstraints c = pp (UnivProblem.Set.pr c)
+let ppuniverse_context_future c =
+ let ctx = Future.force c in
+ ppuniverse_context ctx
+let ppuniverses u = pp (UGraph.pr_universes Level.pr u)
+let ppnamedcontextval e =
+ let env = Global.env () in
+ let sigma = Evd.from_env env in
+ pp (pr_named_context env sigma (named_context_of_val e))
+
+let ppenv e = pp
+ (str "[" ++ pr_named_context_of e Evd.empty ++ str "]" ++ spc() ++
+ str "[" ++ pr_rel_context e Evd.empty (rel_context e) ++ str "]")
+
+let ppenvwithcst e = pp
+ (str "[" ++ pr_named_context_of e Evd.empty ++ str "]" ++ spc() ++
+ str "[" ++ pr_rel_context e Evd.empty (rel_context e) ++ str "]" ++ spc() ++
+ str "{" ++ Environ.fold_constants (fun a _ s -> Constant.print a ++ spc () ++ s) e (mt ()) ++ str "}")
+
+let pptac = (fun x -> pp(Ltac_plugin.Pptactic.pr_glob_tactic (Global.env()) x))
+
+let ppobj obj = Format.print_string (Libobject.object_tag obj)
+
+let cnt = ref 0
+
+let cast_kind_display k =
+ match k with
+ | VMcast -> "VMcast"
+ | DEFAULTcast -> "DEFAULTcast"
+ | REVERTcast -> "REVERTcast"
+ | NATIVEcast -> "NATIVEcast"
+
+let constr_display csr =
+ let rec term_display c = match kind c with
+ | Rel n -> "Rel("^(string_of_int n)^")"
+ | Meta n -> "Meta("^(string_of_int n)^")"
+ | Var id -> "Var("^(Id.to_string id)^")"
+ | Sort s -> "Sort("^(sort_display s)^")"
+ | Cast (c,k, t) ->
+ "Cast("^(term_display c)^","^(cast_kind_display k)^","^(term_display t)^")"
+ | Prod (na,t,c) ->
+ "Prod("^(name_display na)^","^(term_display t)^","^(term_display c)^")\n"
+ | Lambda (na,t,c) ->
+ "Lambda("^(name_display na)^","^(term_display t)^","^(term_display c)^")\n"
+ | LetIn (na,b,t,c) ->
+ "LetIn("^(name_display na)^","^(term_display b)^","
+ ^(term_display t)^","^(term_display c)^")"
+ | App (c,l) -> "App("^(term_display c)^","^(array_display l)^")\n"
+ | Evar (e,l) -> "Evar("^(Pp.string_of_ppcmds (Evar.print e))^","^(array_display l)^")"
+ | Const (c,u) -> "Const("^(Constant.to_string c)^","^(universes_display u)^")"
+ | Ind ((sp,i),u) ->
+ "MutInd("^(MutInd.to_string sp)^","^(string_of_int i)^","^(universes_display u)^")"
+ | Construct (((sp,i),j),u) ->
+ "MutConstruct(("^(MutInd.to_string sp)^","^(string_of_int i)^"),"
+ ^","^(universes_display u)^(string_of_int j)^")"
+ | Proj (p, c) -> "Proj("^(Constant.to_string (Projection.constant p))^","^term_display c ^")"
+ | Case (ci,p,c,bl) ->
+ "MutCase(<abs>,"^(term_display p)^","^(term_display c)^","
+ ^(array_display bl)^")"
+ | Fix ((t,i),(lna,tl,bl)) ->
+ "Fix(([|"^(Array.fold_right (fun x i -> (string_of_int x)^(if not(i="")
+ then (";"^i) else "")) t "")^"|],"^(string_of_int i)^"),"
+ ^(array_display tl)^",[|"
+ ^(Array.fold_right (fun x i -> (name_display x)^(if not(i="")
+ then (";"^i) else "")) lna "")^"|],"
+ ^(array_display bl)^")"
+ | CoFix(i,(lna,tl,bl)) ->
+ "CoFix("^(string_of_int i)^"),"
+ ^(array_display tl)^","
+ ^(Array.fold_right (fun x i -> (name_display x)^(if not(i="")
+ then (";"^i) else "")) lna "")^","
+ ^(array_display bl)^")"
+ | Int i ->
+ "Int("^(Uint63.to_string i)^")"
+
+ and array_display v =
+ "[|"^
+ (Array.fold_right
+ (fun x i -> (term_display x)^(if not(i="") then (";"^i) else ""))
+ v "")^"|]"
+
+ and univ_display u =
+ incr cnt; pp (str "with " ++ int !cnt ++ str" " ++ pr_uni u ++ fnl ())
+
+ and level_display u =
+ incr cnt; pp (str "with " ++ int !cnt ++ str" " ++ Level.pr u ++ fnl ())
+
+ and sort_display = function
+ | SProp -> "SProp"
+ | Set -> "Set"
+ | Prop -> "Prop"
+ | Type u -> univ_display u;
+ "Type("^(string_of_int !cnt)^")"
+
+ and universes_display l =
+ Array.fold_right (fun x i -> level_display x; (string_of_int !cnt)^(if not(i="")
+ then (" "^i) else "")) (Instance.to_array l) ""
+
+ and name_display x = match x.binder_name with
+ | Name id -> "Name("^(Id.to_string id)^")"
+ | Anonymous -> "Anonymous"
+
+ in
+ pp (str (term_display csr) ++fnl ())
+
+let econstr_display c = constr_display EConstr.Unsafe.(to_constr c) ;;
+
+open Format;;
+
+let print_pure_constr csr =
+ let rec term_display c = match Constr.kind c with
+ | Rel n -> print_string "#"; print_int n
+ | Meta n -> print_string "Meta("; print_int n; print_string ")"
+ | Var id -> print_string (Id.to_string id)
+ | Sort s -> sort_display s
+ | Cast (c,_, t) -> open_hovbox 1;
+ print_string "("; (term_display c); print_cut();
+ print_string "::"; (term_display t); print_string ")"; close_box()
+ | Prod ({binder_name=Name(id)},t,c) ->
+ open_hovbox 1;
+ print_string"("; print_string (Id.to_string id);
+ print_string ":"; box_display t;
+ print_string ")"; print_cut();
+ box_display c; close_box()
+ | Prod ({binder_name=Anonymous},t,c) ->
+ print_string"("; box_display t; print_cut(); print_string "->";
+ box_display c; print_string ")";
+ | Lambda (na,t,c) ->
+ print_string "["; name_display na;
+ print_string ":"; box_display t; print_string "]";
+ print_cut(); box_display c;
+ | LetIn (na,b,t,c) ->
+ print_string "["; name_display na; print_string "=";
+ box_display b; print_cut();
+ print_string ":"; box_display t; print_string "]";
+ print_cut(); box_display c;
+ | App (c,l) ->
+ print_string "(";
+ box_display c;
+ Array.iter (fun x -> print_space (); box_display x) l;
+ print_string ")"
+ | Evar (e,l) -> print_string "Evar#"; print_int (Evar.repr e); print_string "{";
+ Array.iter (fun x -> print_space (); box_display x) l;
+ print_string"}"
+ | Const (c,u) -> print_string "Cons(";
+ sp_con_display c;
+ print_string ","; universes_display u;
+ print_string ")"
+ | Proj (p,c') -> print_string "Proj(";
+ sp_con_display (Projection.constant p);
+ print_string ",";
+ box_display c';
+ print_string ")"
+ | Ind ((sp,i),u) ->
+ print_string "Ind(";
+ sp_display sp;
+ print_string ","; print_int i;
+ print_string ","; universes_display u;
+ print_string ")"
+ | Construct (((sp,i),j),u) ->
+ print_string "Constr(";
+ sp_display sp;
+ print_string ",";
+ print_int i; print_string ","; print_int j;
+ print_string ","; universes_display u;
+ print_string ")"
+ | Case (ci,p,c,bl) ->
+ open_vbox 0;
+ print_string "<"; box_display p; print_string ">";
+ print_cut(); print_string "Case";
+ print_space(); box_display c; print_space (); print_string "of";
+ open_vbox 0;
+ Array.iter (fun x -> print_cut(); box_display x) bl;
+ close_box();
+ print_cut();
+ print_string "end";
+ close_box()
+ | Fix ((t,i),(lna,tl,bl)) ->
+ print_string "Fix("; print_int i; print_string ")";
+ print_cut();
+ open_vbox 0;
+ let print_fix () =
+ for k = 0 to (Array.length tl) - 1 do
+ open_vbox 0;
+ name_display lna.(k); print_string "/";
+ print_int t.(k); print_cut(); print_string ":";
+ box_display tl.(k) ; print_cut(); print_string ":=";
+ box_display bl.(k); close_box ();
+ print_cut()
+ done
+ in print_string"{"; print_fix(); print_string"}"
+ | CoFix(i,(lna,tl,bl)) ->
+ print_string "CoFix("; print_int i; print_string ")";
+ print_cut();
+ open_vbox 0;
+ let print_fix () =
+ for k = 0 to (Array.length tl) - 1 do
+ open_vbox 1;
+ name_display lna.(k); print_cut(); print_string ":";
+ box_display tl.(k) ; print_cut(); print_string ":=";
+ box_display bl.(k); close_box ();
+ print_cut();
+ done
+ in print_string"{"; print_fix (); print_string"}"
+ | Int i ->
+ print_string ("Int("^(Uint63.to_string i)^")")
+
+ and box_display c = open_hovbox 1; term_display c; close_box()
+
+ and universes_display u =
+ Array.iter (fun u -> print_space (); pp (Level.pr u)) (Instance.to_array u)
+
+ and sort_display = function
+ | SProp -> print_string "SProp"
+ | Set -> print_string "Set"
+ | Prop -> print_string "Prop"
+ | Type u -> open_hbox();
+ print_string "Type("; pp (pr_uni u); print_string ")"; close_box()
+
+ and name_display x = match x.binder_name with
+ | Name id -> print_string (Id.to_string id)
+ | Anonymous -> print_string "_"
+(* Remove the top names for library and Scratch to avoid long names *)
+ and sp_display sp =
+(* let dir,l = decode_kn sp in
+ let ls =
+ match List.rev_map Id.to_string (DirPath.repr dir) with
+ ("Top"::l)-> l
+ | ("Coq"::_::l) -> l
+ | l -> l
+ in List.iter (fun x -> print_string x; print_string ".") ls;*)
+ print_string (MutInd.debug_to_string sp)
+ and sp_con_display sp =
+(* let dir,l = decode_kn sp in
+ let ls =
+ match List.rev_map Id.to_string (DirPath.repr dir) with
+ ("Top"::l)-> l
+ | ("Coq"::_::l) -> l
+ | l -> l
+ in List.iter (fun x -> print_string x; print_string ".") ls;*)
+ print_string (Constant.debug_to_string sp)
+
+ in
+ try
+ box_display csr; print_flush()
+ with e ->
+ print_string (Printexc.to_string e);print_flush ();
+ raise e
+
+let print_pure_econstr c = print_pure_constr EConstr.Unsafe.(to_constr c) ;;
+
+let pploc x = let (l,r) = Loc.unloc x in
+ print_string"(";print_int l;print_string",";print_int r;print_string")"
+
+let pp_argument_type t = pp (pr_argument_type t)
+
+let pp_generic_argument arg =
+ pp(str"<genarg:"++pr_argument_type(genarg_tag arg)++str">")
+
+let prgenarginfo arg =
+ let Geninterp.Val.Dyn (tag, _) = arg in
+ let tpe = Geninterp.Val.pr tag in
+ (* FIXME *)
+(* try *)
+(* let data = Pptactic.pr_top_generic (Global.env ()) arg in *)
+(* str "<genarg:" ++ tpe ++ str " := [ " ++ data ++ str " ] >" *)
+(* with _any -> *)
+ str "<genarg:" ++ tpe ++ str ">"
+
+let ppgenarginfo arg = pp (prgenarginfo arg)
+
+let ppgenargargt arg = pp (str (Genarg.ArgT.repr arg))
+
+let ppist ist =
+ let pr id arg = prgenarginfo arg in
+ pp (pridmap pr ist.Geninterp.lfun)
+
+(**********************************************************************)
+(* Vernac-level debugging commands *)
+
+let in_current_context f c =
+ let (evmap,sign) = get_current_context () in
+ f (fst (Constrintern.interp_constr sign evmap c))(*FIXME*)
+
+(* We expand the result of preprocessing to be independent of camlp5
+
+VERNAC COMMAND EXTEND PrintPureConstr
+| [ "PrintPureConstr" constr(c) ] -> [ in_current_context print_pure_constr c ]
+END
+VERNAC COMMAND EXTEND PrintConstr
+ [ "PrintConstr" constr(c) ] -> [ in_current_context constr_display c ]
+END
+*)
+
+let _ =
+ let open Vernacextend in
+ let ty_constr = Extend.TUentry (get_arg_tag Stdarg.wit_constr) in
+ let cmd_sig = TyTerminal("PrintConstr", TyNonTerminal(ty_constr, TyNil)) in
+ let cmd_fn c ~atts ~st = in_current_context econstr_display c; st in
+ let cmd_class _ = VtQuery,VtNow in
+ let cmd : ty_ml = TyML (false, cmd_sig, cmd_fn, Some cmd_class) in
+ vernac_extend ~command:"PrintConstr" [cmd]
+
+let _ =
+ let open Vernacextend in
+ let ty_constr = Extend.TUentry (get_arg_tag Stdarg.wit_constr) in
+ let cmd_sig = TyTerminal("PrintPureConstr", TyNonTerminal(ty_constr, TyNil)) in
+ let cmd_fn c ~atts ~st = in_current_context print_pure_econstr c; st in
+ let cmd_class _ = VtQuery,VtNow in
+ let cmd : ty_ml = TyML (false, cmd_sig, cmd_fn, Some cmd_class) in
+ vernac_extend ~command:"PrintPureConstr" [cmd]
+
+(* Setting printer of unbound global reference *)
+open Names
+open Libnames
+
+let encode_path ?loc prefix mpdir suffix id =
+ let dir = match mpdir with
+ | None -> []
+ | Some mp -> DirPath.repr (dirpath_of_string (ModPath.to_string mp))
+ in
+ make_qualid ?loc
+ (DirPath.make (List.rev (Id.of_string prefix::dir@suffix))) id
+
+let raw_string_of_ref ?loc _ = function
+ | ConstRef cst ->
+ let (mp,id) = Constant.repr2 cst in
+ encode_path ?loc "CST" (Some mp) [] (Label.to_id id)
+ | IndRef (kn,i) ->
+ let (mp,id) = MutInd.repr2 kn in
+ encode_path ?loc "IND" (Some mp) [Label.to_id id]
+ (Id.of_string ("_"^string_of_int i))
+ | ConstructRef ((kn,i),j) ->
+ let (mp,id) = MutInd.repr2 kn in
+ encode_path ?loc "CSTR" (Some mp)
+ [Label.to_id id;Id.of_string ("_"^string_of_int i)]
+ (Id.of_string ("_"^string_of_int j))
+ | VarRef id ->
+ encode_path ?loc "SECVAR" None [] id
+
+let short_string_of_ref ?loc _ = function
+ | VarRef id -> qualid_of_ident ?loc id
+ | ConstRef cst -> qualid_of_ident ?loc (Label.to_id (Constant.label cst))
+ | IndRef (kn,0) -> qualid_of_ident ?loc (Label.to_id (MutInd.label kn))
+ | IndRef (kn,i) ->
+ encode_path ?loc "IND" None [Label.to_id (MutInd.label kn)]
+ (Id.of_string ("_"^string_of_int i))
+ | ConstructRef ((kn,i),j) ->
+ encode_path ?loc "CSTR" None
+ [Label.to_id (MutInd.label kn);Id.of_string ("_"^string_of_int i)]
+ (Id.of_string ("_"^string_of_int j))
+
+(* Anticipate that printers can be used from ocamldebug and that
+ pretty-printer should not make calls to the global env since ocamldebug
+ runs in a different process and does not have the proper env at hand *)
+let _ = Flags.in_debugger := true
+let _ = Constrextern.set_extern_reference
+ (if !rawdebug then raw_string_of_ref else short_string_of_ref)