wenzelm@27340
|
1 |
(* Title: Pure/ML/ml_antiquote.ML
|
wenzelm@27340
|
2 |
Author: Makarius
|
wenzelm@27340
|
3 |
|
wenzelm@27340
|
4 |
Common ML antiquotations.
|
wenzelm@27340
|
5 |
*)
|
wenzelm@27340
|
6 |
|
wenzelm@27340
|
7 |
signature ML_ANTIQUOTE =
|
wenzelm@27340
|
8 |
sig
|
wenzelm@27379
|
9 |
val macro: string ->
|
wenzelm@27379
|
10 |
(Context.generic * Args.T list -> Proof.context * (Context.generic * Args.T list)) -> unit
|
wenzelm@27340
|
11 |
val variant: string -> Proof.context -> string * Proof.context
|
wenzelm@27340
|
12 |
val inline: string ->
|
wenzelm@27340
|
13 |
(Context.generic * Args.T list -> string * (Context.generic * Args.T list)) -> unit
|
wenzelm@27340
|
14 |
val declaration: string -> string ->
|
wenzelm@27340
|
15 |
(Context.generic * Args.T list -> string * (Context.generic * Args.T list)) -> unit
|
wenzelm@27340
|
16 |
val value: string ->
|
wenzelm@27340
|
17 |
(Context.generic * Args.T list -> string * (Context.generic * Args.T list)) -> unit
|
wenzelm@27340
|
18 |
end;
|
wenzelm@27340
|
19 |
|
wenzelm@27340
|
20 |
structure ML_Antiquote: ML_ANTIQUOTE =
|
wenzelm@27340
|
21 |
struct
|
wenzelm@27340
|
22 |
|
wenzelm@27340
|
23 |
(** generic tools **)
|
wenzelm@27340
|
24 |
|
wenzelm@27340
|
25 |
(* ML names *)
|
wenzelm@27340
|
26 |
|
wenzelm@27340
|
27 |
structure NamesData = ProofDataFun
|
wenzelm@27340
|
28 |
(
|
wenzelm@27340
|
29 |
type T = Name.context;
|
wenzelm@27340
|
30 |
fun init _ = ML_Syntax.reserved;
|
wenzelm@27340
|
31 |
);
|
wenzelm@27340
|
32 |
|
wenzelm@27340
|
33 |
fun variant a ctxt =
|
wenzelm@27340
|
34 |
let
|
wenzelm@27340
|
35 |
val names = NamesData.get ctxt;
|
wenzelm@27340
|
36 |
val ([b], names') = Name.variants [a] names;
|
wenzelm@27340
|
37 |
val ctxt' = NamesData.put names' ctxt;
|
wenzelm@27340
|
38 |
in (b, ctxt') end;
|
wenzelm@27340
|
39 |
|
wenzelm@27340
|
40 |
|
wenzelm@27340
|
41 |
(* specific antiquotations *)
|
wenzelm@27340
|
42 |
|
wenzelm@27379
|
43 |
fun macro name scan = ML_Context.add_antiq name
|
wenzelm@27868
|
44 |
(fn _ => scan :|-- (fn ctxt => Scan.depend (fn _ => Scan.succeed
|
wenzelm@27379
|
45 |
(Context.Proof ctxt, fn {background, ...} => (K ("", ""), background)))));
|
wenzelm@27379
|
46 |
|
wenzelm@27340
|
47 |
fun inline name scan = ML_Context.add_antiq name
|
wenzelm@27868
|
48 |
(fn _ => scan >> (fn s => fn {struct_name, background} => (K ("", s), background)));
|
wenzelm@27340
|
49 |
|
wenzelm@27340
|
50 |
fun declaration kind name scan = ML_Context.add_antiq name
|
wenzelm@27868
|
51 |
(fn _ => scan >> (fn s => fn {struct_name, background} =>
|
wenzelm@27340
|
52 |
let
|
wenzelm@27340
|
53 |
val (a, background') = variant name background;
|
wenzelm@27340
|
54 |
val env = kind ^ " " ^ a ^ " = " ^ s ^ ";\n";
|
wenzelm@27340
|
55 |
val body = struct_name ^ "." ^ a;
|
wenzelm@27340
|
56 |
in (K (env, body), background') end));
|
wenzelm@27340
|
57 |
|
wenzelm@27340
|
58 |
val value = declaration "val";
|
wenzelm@27340
|
59 |
|
wenzelm@27340
|
60 |
|
wenzelm@27340
|
61 |
|
wenzelm@30231
|
62 |
(** misc antiquotations **)
|
wenzelm@27340
|
63 |
|
wenzelm@27809
|
64 |
structure P = OuterParse;
|
wenzelm@27809
|
65 |
|
wenzelm@30231
|
66 |
val _ = inline "binding" (Scan.lift (P.position Args.name) >> (fn b =>
|
wenzelm@30231
|
67 |
ML_Syntax.atomic ("Binding.make " ^
|
wenzelm@30231
|
68 |
ML_Syntax.print_pair ML_Syntax.print_string ML_Syntax.print_position b)));
|
wenzelm@27340
|
69 |
|
wenzelm@27340
|
70 |
val _ = value "theory"
|
wenzelm@27340
|
71 |
(Scan.lift Args.name >> (fn name => "ThyInfo.get_theory " ^ ML_Syntax.print_string name)
|
wenzelm@27340
|
72 |
|| Scan.succeed "ML_Context.the_global_context ()");
|
wenzelm@27340
|
73 |
|
wenzelm@27340
|
74 |
val _ = value "theory_ref"
|
wenzelm@27340
|
75 |
(Scan.lift Args.name >> (fn name =>
|
wenzelm@27340
|
76 |
"Theory.check_thy (ThyInfo.theory " ^ ML_Syntax.print_string name ^ ")")
|
wenzelm@27340
|
77 |
|| Scan.succeed "Theory.check_thy (ML_Context.the_global_context ())");
|
wenzelm@27340
|
78 |
|
wenzelm@27340
|
79 |
val _ = value "context" (Scan.succeed "ML_Context.the_local_context ()");
|
wenzelm@27340
|
80 |
|
wenzelm@27882
|
81 |
val _ = inline "sort" (Args.context -- Scan.lift Args.name_source >> (fn (ctxt, s) =>
|
wenzelm@27340
|
82 |
ML_Syntax.atomic (ML_Syntax.print_sort (Syntax.read_sort ctxt s))));
|
wenzelm@27340
|
83 |
|
wenzelm@27340
|
84 |
val _ = inline "typ" (Args.typ >> (ML_Syntax.atomic o ML_Syntax.print_typ));
|
wenzelm@27340
|
85 |
val _ = inline "term" (Args.term >> (ML_Syntax.atomic o ML_Syntax.print_term));
|
wenzelm@27340
|
86 |
val _ = inline "prop" (Args.prop >> (ML_Syntax.atomic o ML_Syntax.print_term));
|
wenzelm@27340
|
87 |
|
wenzelm@27379
|
88 |
val _ = macro "let" (Args.context --
|
wenzelm@27882
|
89 |
Scan.lift (P.and_list1 (P.and_list1 Args.name_source -- (Args.$$$ "=" |-- Args.name_source)))
|
wenzelm@27379
|
90 |
>> (fn (ctxt, args) => #2 (ProofContext.match_bind true args ctxt)));
|
wenzelm@27379
|
91 |
|
wenzelm@27379
|
92 |
val _ = macro "note" (Args.context :|-- (fn ctxt =>
|
wenzelm@27809
|
93 |
P.and_list1' (Scan.lift (Args.opt_thm_name I "=") -- Attrib.thms >> (fn ((a, srcs), ths) =>
|
wenzelm@27379
|
94 |
((a, map (Attrib.attribute (ProofContext.theory_of ctxt)) srcs), [(ths, [])])))
|
wenzelm@27379
|
95 |
>> (fn args => #2 (ProofContext.note_thmss_i "" args ctxt))));
|
wenzelm@27379
|
96 |
|
wenzelm@27340
|
97 |
val _ = value "ctyp" (Args.typ >> (fn T =>
|
wenzelm@27340
|
98 |
"Thm.ctyp_of (ML_Context.the_global_context ()) " ^ ML_Syntax.atomic (ML_Syntax.print_typ T)));
|
wenzelm@27340
|
99 |
|
wenzelm@27340
|
100 |
val _ = value "cterm" (Args.term >> (fn t =>
|
wenzelm@27340
|
101 |
"Thm.cterm_of (ML_Context.the_global_context ()) " ^ ML_Syntax.atomic (ML_Syntax.print_term t)));
|
wenzelm@27340
|
102 |
|
wenzelm@27340
|
103 |
val _ = value "cprop" (Args.prop >> (fn t =>
|
wenzelm@27340
|
104 |
"Thm.cterm_of (ML_Context.the_global_context ()) " ^ ML_Syntax.atomic (ML_Syntax.print_term t)));
|
wenzelm@27340
|
105 |
|
wenzelm@27340
|
106 |
val _ = value "cpat"
|
wenzelm@27882
|
107 |
(Args.context -- Scan.lift Args.name_source >> uncurry ProofContext.read_term_pattern >> (fn t =>
|
wenzelm@27340
|
108 |
"Thm.cterm_of (ML_Context.the_global_context ()) " ^ ML_Syntax.atomic (ML_Syntax.print_term t)));
|
wenzelm@27340
|
109 |
|
wenzelm@27340
|
110 |
|
wenzelm@27882
|
111 |
fun type_ syn = (Args.context -- Scan.lift Args.name_source >> (fn (ctxt, c) =>
|
wenzelm@27340
|
112 |
#1 (Term.dest_Type (ProofContext.read_tyname ctxt c))
|
wenzelm@30280
|
113 |
|> syn ? NameSpace.base_name
|
wenzelm@27340
|
114 |
|> ML_Syntax.print_string));
|
wenzelm@27340
|
115 |
|
wenzelm@27340
|
116 |
val _ = inline "type_name" (type_ false);
|
wenzelm@27340
|
117 |
val _ = inline "type_syntax" (type_ true);
|
wenzelm@27340
|
118 |
|
wenzelm@27340
|
119 |
|
wenzelm@27882
|
120 |
fun const syn = Args.context -- Scan.lift Args.name_source >> (fn (ctxt, c) =>
|
wenzelm@27340
|
121 |
#1 (Term.dest_Const (ProofContext.read_const_proper ctxt c))
|
wenzelm@27340
|
122 |
|> syn ? ProofContext.const_syntax_name ctxt
|
wenzelm@27340
|
123 |
|> ML_Syntax.print_string);
|
wenzelm@27340
|
124 |
|
wenzelm@27340
|
125 |
val _ = inline "const_name" (const false);
|
wenzelm@27340
|
126 |
val _ = inline "const_syntax" (const true);
|
wenzelm@27340
|
127 |
|
wenzelm@27340
|
128 |
val _ = inline "const"
|
wenzelm@27882
|
129 |
(Args.context -- Scan.lift Args.name_source -- Scan.optional
|
wenzelm@27809
|
130 |
(Scan.lift (Args.$$$ "(") |-- OuterParse.enum1' "," Args.typ --| Scan.lift (Args.$$$ ")")) []
|
wenzelm@27340
|
131 |
>> (fn ((ctxt, c), Ts) =>
|
wenzelm@27340
|
132 |
let val (c, _) = Term.dest_Const (ProofContext.read_const_proper ctxt c)
|
wenzelm@27340
|
133 |
in ML_Syntax.atomic (ML_Syntax.print_term (ProofContext.mk_const ctxt (c, Ts))) end));
|
wenzelm@27340
|
134 |
|
wenzelm@27340
|
135 |
end;
|
wenzelm@27340
|
136 |
|