aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--g_ltac2.ml410
-rw-r--r--tac2core.ml14
-rw-r--r--tac2env.ml4
-rw-r--r--tac2env.mli4
-rw-r--r--tac2intern.ml17
5 files changed, 49 insertions, 0 deletions
diff --git a/g_ltac2.ml4 b/g_ltac2.ml4
index ff3d79bbae..1dbd223b22 100644
--- a/g_ltac2.ml4
+++ b/g_ltac2.ml4
@@ -11,6 +11,8 @@ open Util
open Genarg
open Names
open Pcoq
+open Constrexpr
+open Misctypes
open Tac2expr
open Ltac_plugin
@@ -190,6 +192,14 @@ GEXTEND Gram
;
END
+GEXTEND Gram
+ Pcoq.Constr.operconstr: LEVEL "0"
+ [ [ IDENT "ltac2"; ":"; "("; tac = tac2expr; ")" ->
+ let arg = Genarg.in_gen (Genarg.rawwit Tac2env.wit_ltac2) tac in
+ CHole (!@loc, None, IntroAnonymous, Some arg) ] ]
+ ;
+END
+
let pr_ltac2entry _ = mt () (** FIXME *)
let pr_ltac2expr _ = mt () (** FIXME *)
diff --git a/tac2core.ml b/tac2core.ml
index fd998151fd..c18b6032a6 100644
--- a/tac2core.ml
+++ b/tac2core.ml
@@ -473,3 +473,17 @@ let () =
ml_interp = interp;
} in
define_ml_object Stdarg.wit_ident obj
+
+let () =
+ let interp ist env sigma concl tac =
+ let fold id (Val.Dyn (tag, v)) (accu : environment) : environment =
+ match Val.eq tag val_valexpr with
+ | None -> accu
+ | Some Refl -> Id.Map.add id v accu
+ in
+ let ist = Id.Map.fold fold ist Id.Map.empty in
+ let tac = Proofview.tclIGNORE (interp ist tac) in
+ let c, sigma = Pfedit.refine_by_tactic env sigma concl tac in
+ (EConstr.of_constr c, sigma)
+ in
+ Pretyping.register_constr_interp0 wit_ltac2 interp
diff --git a/tac2env.ml b/tac2env.ml
index 17c70d2e44..a058d764e7 100644
--- a/tac2env.ml
+++ b/tac2env.ml
@@ -208,3 +208,7 @@ let interp_ml_object t = MLType.obj t
let coq_prefix =
MPfile (DirPath.make (List.map Id.of_string ["Init"; "ltac2"; "Coq"]))
+
+(** Generic arguments *)
+
+let wit_ltac2 = Genarg.make0 "ltac2"
diff --git a/tac2env.mli b/tac2env.mli
index 96174e8c92..4d2a1645ea 100644
--- a/tac2env.mli
+++ b/tac2env.mli
@@ -100,3 +100,7 @@ val interp_ml_object : ('a, 'b, 'c) genarg_type -> 'b ml_object
val coq_prefix : ModPath.t
(** Path where primitive datatypes are defined in Ltac2 plugin. *)
+
+(** {5 Generic arguments} *)
+
+val wit_ltac2 : (raw_tacexpr, glb_tacexpr, Util.Empty.t) genarg_type
diff --git a/tac2intern.ml b/tac2intern.ml
index 23f8325da8..bc15b567d4 100644
--- a/tac2intern.ml
+++ b/tac2intern.ml
@@ -1054,3 +1054,20 @@ let subst_quant_typedef subst (prm, def as qdef) =
let subst_type_scheme subst (prm, t as sch) =
let t' = subst_type subst t in
if t' == t then sch else (prm, t')
+
+(** Registering *)
+
+let () =
+ let open Genintern in
+ let intern ist tac =
+ let env = match Genintern.Store.get ist.extra ltac2_env with
+ | None -> empty_env ()
+ | Some env -> env
+ in
+ let loc = loc_of_tacexpr tac in
+ let (tac, t) = intern_rec env tac in
+ let () = check_elt_unit loc env t in
+ (ist, tac)
+ in
+ Genintern.register_intern0 wit_ltac2 intern
+let () = Genintern.register_subst0 wit_ltac2 subst_expr