@@ -42,6 +42,17 @@ open Ltac_pretype
4242
4343module TacStore = Tacenv. TacStore
4444
45+ (* * Abstract application, to print ltac functions *)
46+ type appl =
47+ | UnnamedAppl (* * For generic applications: nothing is printed *)
48+ | GlbAppl of (Names.KerName .t * Geninterp.Val .t list ) list
49+ (* * For calls to global constants, some may alias other. *)
50+
51+ type tacvalue_v =
52+ | VFun of appl * ltac_trace * Loc .t option * Geninterp.Val .t Id.Map .t *
53+ Name .t list * glob_tactic_expr
54+ | VRec of Geninterp.Val .t Id.Map .t ref * glob_tactic_expr
55+
4556(* Signature for interpretation: val_interp and interpretation functions *)
4657type interp_sign = Tacenv .interp_sign =
4758 { lfun : Geninterp.Val .t Id.Map .t
@@ -138,6 +149,30 @@ let combine_appl appl1 appl2 =
138149let of_tacvalue = Value. of_tacvalue
139150let to_tacvalue = Value. to_tacvalue
140151
152+ let (of_tacvalue_v : tacvalue_v -> tacvalue ), to_tacvalue_v = Tacarg.Internal. define_tacvalue ()
153+
154+ let pr_tacvalue env v = match to_tacvalue_v v with
155+ | VFun (a ,_ ,loc ,ids ,l ,tac ) ->
156+ let open Pp in
157+ let tac = if List. is_empty l then tac else CAst. make ?loc @@ Tacexpr. TacFun (l,tac) in
158+ let pr_env env =
159+ if Id.Map. is_empty ids then mt ()
160+ else
161+ cut () ++ str " where" ++
162+ Id.Map. fold (fun id c pp ->
163+ cut () ++ Id. print id ++ str " := " ++ Pptactic. pr_value Pptactic. ltop c ++ pp)
164+ ids (mt () )
165+ in
166+ v 0 (hov 0 (Pptactic. pr_glob_tactic env tac) ++ pr_env env)
167+ | VRec _ -> str " <tactic closure>"
168+
169+ let () =
170+ Pptactic.Internal. pr_tacvalue_ref := fun env v ->
171+ pr_tacvalue env v
172+
173+ let to_tacvalue_val v = Option. map to_tacvalue_v @@ to_tacvalue v
174+ let of_tacvalue_val v = of_tacvalue @@ of_tacvalue_v v
175+
141176(* Debug reference *)
142177let debug = ref DebugOff
143178
@@ -154,9 +189,9 @@ let is_traced () =
154189
155190(* * More naming applications *)
156191let name_vfun appl vle =
157- match to_tacvalue vle with
192+ match to_tacvalue_val vle with
158193 | Some (VFun (appl0 ,trace ,loc ,lfun ,vars ,t )) ->
159- of_tacvalue (VFun (combine_appl appl0 appl,trace,loc,lfun,vars,t))
194+ of_tacvalue_val (VFun (combine_appl appl0 appl,trace,loc,lfun,vars,t))
160195 | Some (VRec _ ) | None -> vle
161196
162197let f_avoid_ids : Id.Set.t TacStore.field = TacStore. field " f_avoid_ids"
@@ -261,7 +296,7 @@ let pr_closure env ist body =
261296let pr_inspect env expr result =
262297 let pp_expr = Pptactic. pr_glob_tactic env expr in
263298 let pp_result =
264- match to_tacvalue result with
299+ match to_tacvalue_val result with
265300 | Some (VFun (_ , _ , _ , ist , ul , b )) ->
266301 let body = if List. is_empty ul then b else CAst. make (TacFun (ul, b)) in
267302 str " a closure with body " ++ fnl() ++ pr_closure env ist body
@@ -286,7 +321,7 @@ let push_trace call ist =
286321 else [] ,[]
287322
288323let propagate_trace ist loc id v =
289- match to_tacvalue v with
324+ match to_tacvalue_val v with
290325 | None -> Proofview. tclUNIT v
291326 | Some tacv ->
292327 match tacv with
@@ -299,21 +334,21 @@ let propagate_trace ist loc id v =
299334 let t = if List. is_empty it then b else CAst. make (TacFun (it,b)) in
300335 let trace = push_trace(loc,LtacVarCall (kn,id,t)) ist in
301336 let ans = VFun (appl,trace,loc,lfun,it,b) in
302- Proofview. tclUNIT (of_tacvalue ans)
337+ Proofview. tclUNIT (of_tacvalue_val ans)
303338 | VRec _ -> Proofview. tclUNIT v
304339
305340let append_trace trace v =
306- match to_tacvalue v with
307- | Some (VFun (appl ,trace' ,loc ,lfun ,it ,b )) -> of_tacvalue (VFun (appl,trace',loc,lfun,it,b))
341+ match to_tacvalue_val v with
342+ | Some (VFun (appl ,trace' ,loc ,lfun ,it ,b )) -> of_tacvalue_val (VFun (appl,trace',loc,lfun,it,b))
308343 | _ -> v
309344
310345(* Dynamically check that an argument is a tactic *)
311346let coerce_to_tactic loc id v =
312347 let fail () = user_err ?loc
313348 (str " Variable " ++ Id. print id ++ str " should be bound to a tactic." )
314349 in
315- match to_tacvalue v with
316- | Some (VFun (appl ,trace ,_ ,lfun ,it ,b )) -> of_tacvalue (VFun (appl,trace,loc,lfun,it,b))
350+ match to_tacvalue_val v with
351+ | Some (VFun (appl ,trace ,_ ,lfun ,it ,b )) -> of_tacvalue_val (VFun (appl,trace,loc,lfun,it,b))
317352 | _ -> fail ()
318353
319354let intro_pattern_of_ident id = CAst. make @@ IntroNaming (IntroIdentifier id)
@@ -1151,15 +1186,15 @@ let rec val_interp ist ?(appl=UnnamedAppl) (tac:glob_tactic_expr) : Val.t Ftacti
11511186 let value_interp ist =
11521187 match tac2 with
11531188 | TacFun (it , body ) ->
1154- Ftactic. return (of_tacvalue (VFun (UnnamedAppl , extract_trace ist, extract_loc ist, ist.lfun, it, body)))
1189+ Ftactic. return (of_tacvalue_val (VFun (UnnamedAppl , extract_trace ist, extract_loc ist, ist.lfun, it, body)))
11551190 | TacLetIn (true ,l ,u ) -> interp_letrec ist l u
11561191 | TacLetIn (false ,l ,u ) -> interp_letin ist l u
11571192 | TacMatchGoal (lz ,lr ,lmr ) -> interp_match_goal ist lz lr lmr
11581193 | TacMatch (lz ,c ,lmr ) -> interp_match ist lz c lmr
11591194 | TacArg v -> interp_tacarg ist v
11601195 | _ ->
11611196 (* Delayed evaluation *)
1162- Ftactic. return (of_tacvalue (VFun (UnnamedAppl , extract_trace ist, extract_loc ist, ist.lfun, [] , tac)))
1197+ Ftactic. return (of_tacvalue_val (VFun (UnnamedAppl , extract_trace ist, extract_loc ist, ist.lfun, [] , tac)))
11631198 in
11641199 let open Ftactic in
11651200 Control. check_for_interrupt () ;
@@ -1305,7 +1340,7 @@ and eval_tactic_ist ist tac : unit Proofview.tactic =
13051340 Ftactic. run args tac
13061341
13071342and force_vrec ist v : Val.t Ftactic.t =
1308- match to_tacvalue v with
1343+ match to_tacvalue_val v with
13091344 | Some (VRec (lfun ,body )) -> val_interp {ist with lfun = ! lfun} body
13101345 | _ -> Ftactic. return v
13111346
@@ -1385,7 +1420,7 @@ and interp_tacarg ist arg : Val.t Ftactic.t =
13851420and interp_app loc ist fv largs : Val.t Ftactic.t =
13861421 Proofview. tclProofInfo [@ ocaml.warning " -3" ] >> = fun (_name , poly ) ->
13871422 let (>> = ) = Ftactic. bind in
1388- match to_tacvalue fv with
1423+ match to_tacvalue_val fv with
13891424 | None | Some (VRec _ ) -> Tacticals. tclZEROMSG (str " Illegal tactic application." )
13901425 (* if var=[] and body has been delayed by val_interp, then body
13911426 is not a tactic that expects arguments.
@@ -1432,7 +1467,7 @@ and interp_app loc ist fv largs : Val.t Ftactic.t =
14321467 end < *>
14331468 if List. is_empty lval then Ftactic. return v else interp_app loc ist v lval
14341469 else
1435- Ftactic. return (of_tacvalue (VFun (push_appl appl largs,trace,loc,newlfun,lvar,body)))
1470+ Ftactic. return (of_tacvalue_val (VFun (push_appl appl largs,trace,loc,newlfun,lvar,body)))
14361471 | Some (VFun(appl ,trace ,_ ,olfun ,[] ,body )) ->
14371472 let extra_args = List. length largs in
14381473 let info = Exninfo. reify () in
@@ -1454,7 +1489,7 @@ and tactic_of_value ist vle =
14541489 let info = Exninfo. reify () in
14551490 Tacticals. tclZEROMSG ~info (str " Expression does not evaluate to a tactic (got a " ++ str name ++ str " )." )
14561491
1457- and tactic_of_tacvalue ist = function
1492+ and tactic_of_tacvalue ist v = match to_tacvalue_v v with
14581493 | VFun (appl ,trace ,loc ,lfun ,[] ,t ) ->
14591494 Proofview. tclProofInfo [@ ocaml.warning " -3" ] >> = fun (_name , poly ) ->
14601495 let ist = {
@@ -1506,7 +1541,7 @@ and interp_letrec ist llc u =
15061541 Proofview. tclUNIT () >> = fun () -> (* delay for the effects of [lref], just in case. *)
15071542 let lref = ref ist.lfun in
15081543 let fold accu ({v =na } , b ) =
1509- let v = of_tacvalue (VRec (lref, CAst. make (TacArg b))) in
1544+ let v = of_tacvalue_val (VRec (lref, CAst. make (TacArg b))) in
15101545 Name. fold_right (fun id -> Id.Map. add id v) na accu
15111546 in
15121547 let lfun = List. fold_left fold ist.lfun llc in
@@ -1536,7 +1571,7 @@ and interp_match_success ist { Tactic_matching.subst ; context ; terms ; lhs } =
15361571 let lfun = extend_values_with_bindings subst (lctxt +++ hyp_subst +++ ist.lfun) in
15371572 let ist = { ist with lfun } in
15381573 val_interp ist lhs >> = fun v ->
1539- match to_tacvalue v with
1574+ match to_tacvalue_val v with
15401575 | Some (VFun (appl ,trace ,loc ,lfun ,[] ,t )) ->
15411576 let ist =
15421577 { lfun = lfun
@@ -1547,7 +1582,7 @@ and interp_match_success ist { Tactic_matching.subst ; context ; terms ; lhs } =
15471582 let dummy = VFun (appl, extract_trace ist, loc, Id.Map. empty, [] ,
15481583 CAst. make (TacId [] )) in
15491584 let (stack, _) = trace in
1550- catch_error_tac stack (tac < *> Ftactic. return (of_tacvalue dummy))
1585+ catch_error_tac stack (tac < *> Ftactic. return (of_tacvalue_val dummy))
15511586 | _ -> Ftactic. return v
15521587
15531588
@@ -2000,7 +2035,7 @@ module Value = struct
20002035 include Taccoerce. Value
20012036
20022037 let closure ist tac =
2003- VFun (UnnamedAppl , extract_trace ist, None , ist.lfun, [] , tac)
2038+ of_tacvalue_v @@ VFun (UnnamedAppl , extract_trace ist, None , ist.lfun, [] , tac)
20042039
20052040 let of_closure ist tac =
20062041 let closure = closure ist tac in
0 commit comments