src/Pure/ML/ml_antiquote.ML
author wenzelm
Thu, 05 Mar 2009 12:08:00 +0100
changeset 30280 eb98b49ef835
parent 30231 b3f3ad327d4d
child 30364 577edc39b501
permissions -rw-r--r--
renamed NameSpace.base to NameSpace.base_name;
renamed NameSpace.map_base to NameSpace.map_base_name;
eliminated alias Sign.base_name = NameSpace.base_name;
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