src/Pure/ML/ml_antiquotations.ML
author wenzelm
Sat, 17 Aug 2019 17:21:30 +0200
changeset 70565 d0b75c59beca
parent 69595 ec135235fbcc
child 73550 2f6855142a8c
permissions -rw-r--r--
added ML antiquotation @{oracle_name};
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/ML/ml_antiquotations.ML
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
     3
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
     4
Miscellaneous ML antiquotations.
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
     5
*)
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
     6
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
     7
structure ML_Antiquotations: sig end =
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
     8
struct
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
     9
58632
wenzelm
parents: 58046
diff changeset
    10
(* ML support *)
wenzelm
parents: 58046
diff changeset
    11
wenzelm
parents: 58046
diff changeset
    12
val _ = Theory.setup
67147
dea94b1aabc3 prefer control symbol antiquotations;
wenzelm
parents: 67146
diff changeset
    13
 (ML_Antiquotation.inline \<^binding>\<open>undefined\<close>
61597
53e32a9b66b8 added @{undefined} with somewhat undefined symbol;
wenzelm
parents: 61596
diff changeset
    14
    (Scan.succeed "(raise General.Match)") #>
53e32a9b66b8 added @{undefined} with somewhat undefined symbol;
wenzelm
parents: 61596
diff changeset
    15
67147
dea94b1aabc3 prefer control symbol antiquotations;
wenzelm
parents: 67146
diff changeset
    16
  ML_Antiquotation.inline \<^binding>\<open>assert\<close>
58632
wenzelm
parents: 58046
diff changeset
    17
    (Scan.succeed "(fn b => if b then () else raise General.Fail \"Assertion failed\")") #>
wenzelm
parents: 58046
diff changeset
    18
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
    19
  ML_Antiquotation.declaration_embedded \<^binding>\<open>print\<close>
63120
629a4c5e953e embedded content may be delimited via cartouches;
wenzelm
parents: 62900
diff changeset
    20
    (Scan.lift (Scan.optional Args.embedded "Output.writeln"))
58632
wenzelm
parents: 58046
diff changeset
    21
      (fn src => fn output => fn ctxt =>
wenzelm
parents: 58046
diff changeset
    22
        let
59127
723b11f8ffbf more careful handling of auxiliary environment structure -- allow nested ML evaluation;
wenzelm
parents: 59112
diff changeset
    23
          val struct_name = ML_Context.struct_name ctxt;
58632
wenzelm
parents: 58046
diff changeset
    24
          val (_, pos) = Token.name_of_src src;
59112
e670969f34df expand ML cartouches to Input.source;
wenzelm
parents: 59064
diff changeset
    25
          val (a, ctxt') = ML_Context.variant "output" ctxt;
58632
wenzelm
parents: 58046
diff changeset
    26
          val env =
wenzelm
parents: 58046
diff changeset
    27
            "val " ^ a ^ ": string -> unit =\n\
wenzelm
parents: 58046
diff changeset
    28
            \  (" ^ output ^ ") o (fn s => s ^ Position.here (" ^
wenzelm
parents: 58046
diff changeset
    29
            ML_Syntax.print_position pos ^ "));\n";
wenzelm
parents: 58046
diff changeset
    30
          val body =
62900
c641bf9402fd simplified default print_depth: context is usually available, in contrast to 0d295e339f52;
wenzelm
parents: 62899
diff changeset
    31
            "(fn x => (" ^ struct_name ^ "." ^ a ^ " (" ^ ML_Pretty.make_string_fn ^ " x); x))";
63204
921a5be54132 support rat numerals via special antiquotation syntax;
wenzelm
parents: 63120
diff changeset
    32
        in (K (env, body), ctxt') end) #>
921a5be54132 support rat numerals via special antiquotation syntax;
wenzelm
parents: 63120
diff changeset
    33
67147
dea94b1aabc3 prefer control symbol antiquotations;
wenzelm
parents: 67146
diff changeset
    34
  ML_Antiquotation.value \<^binding>\<open>rat\<close>
63204
921a5be54132 support rat numerals via special antiquotation syntax;
wenzelm
parents: 63120
diff changeset
    35
    (Scan.lift (Scan.optional (Args.$$$ "~" >> K ~1) 1 -- Parse.nat --
921a5be54132 support rat numerals via special antiquotation syntax;
wenzelm
parents: 63120
diff changeset
    36
      Scan.optional (Args.$$$ "/" |-- Parse.nat) 1) >> (fn ((sign, a), b) =>
921a5be54132 support rat numerals via special antiquotation syntax;
wenzelm
parents: 63120
diff changeset
    37
        "Rat.make " ^ ML_Syntax.print_pair ML_Syntax.print_int ML_Syntax.print_int (sign * a, b))))
58632
wenzelm
parents: 58046
diff changeset
    38
wenzelm
parents: 58046
diff changeset
    39
wenzelm
parents: 58046
diff changeset
    40
(* formal entities *)
wenzelm
parents: 58046
diff changeset
    41
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
    42
val _ = Theory.setup
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
    43
 (ML_Antiquotation.value_embedded \<^binding>\<open>system_option\<close>
69349
7cef9e386ffe more accurate positions for "name" (quoted string) and "embedded" (cartouche): refer to content without delimiters, which is e.g. relevant for systematic selection/renaming of scope groups;
wenzelm
parents: 68482
diff changeset
    44
    (Args.context -- Scan.lift Args.embedded_position >> (fn (ctxt, (name, pos)) =>
67208
16519cd83ed4 clarified signature;
wenzelm
parents: 67147
diff changeset
    45
      (Completion.check_option (Options.default ()) ctxt (name, pos) |> ML_Syntax.print_string))) #>
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
    46
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
    47
  ML_Antiquotation.value_embedded \<^binding>\<open>theory\<close>
69349
7cef9e386ffe more accurate positions for "name" (quoted string) and "embedded" (cartouche): refer to content without delimiters, which is e.g. relevant for systematic selection/renaming of scope groups;
wenzelm
parents: 68482
diff changeset
    48
    (Args.context -- Scan.lift Args.embedded_position >> (fn (ctxt, (name, pos)) =>
68482
cb84beb84ca9 clarified signature;
wenzelm
parents: 67208
diff changeset
    49
      (Theory.check {long = false} ctxt (name, pos);
cb84beb84ca9 clarified signature;
wenzelm
parents: 67208
diff changeset
    50
       "Context.get_theory {long = false} (Proof_Context.theory_of ML_context) " ^
cb84beb84ca9 clarified signature;
wenzelm
parents: 67208
diff changeset
    51
        ML_Syntax.print_string name))
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
    52
    || Scan.succeed "Proof_Context.theory_of ML_context") #>
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
    53
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
    54
  ML_Antiquotation.value_embedded \<^binding>\<open>theory_context\<close>
69349
7cef9e386ffe more accurate positions for "name" (quoted string) and "embedded" (cartouche): refer to content without delimiters, which is e.g. relevant for systematic selection/renaming of scope groups;
wenzelm
parents: 68482
diff changeset
    55
    (Args.context -- Scan.lift Args.embedded_position >> (fn (ctxt, (name, pos)) =>
68482
cb84beb84ca9 clarified signature;
wenzelm
parents: 67208
diff changeset
    56
      (Theory.check {long = false} ctxt (name, pos);
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
    57
       "Proof_Context.get_global (Proof_Context.theory_of ML_context) " ^
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
    58
        ML_Syntax.print_string name))) #>
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
    59
67147
dea94b1aabc3 prefer control symbol antiquotations;
wenzelm
parents: 67146
diff changeset
    60
  ML_Antiquotation.inline \<^binding>\<open>context\<close>
59127
723b11f8ffbf more careful handling of auxiliary environment structure -- allow nested ML evaluation;
wenzelm
parents: 59112
diff changeset
    61
    (Args.context >> (fn ctxt => ML_Context.struct_name ctxt ^ ".ML_context")) #>
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
    62
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
    63
  ML_Antiquotation.inline_embedded \<^binding>\<open>typ\<close>
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
    64
    (Args.typ >> (ML_Syntax.atomic o ML_Syntax.print_typ)) #>
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
    65
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
    66
  ML_Antiquotation.inline_embedded \<^binding>\<open>term\<close>
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
    67
    (Args.term >> (ML_Syntax.atomic o ML_Syntax.print_term)) #>
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
    68
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
    69
  ML_Antiquotation.inline_embedded \<^binding>\<open>prop\<close>
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
    70
    (Args.prop >> (ML_Syntax.atomic o ML_Syntax.print_term)) #>
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
    71
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
    72
  ML_Antiquotation.value_embedded \<^binding>\<open>ctyp\<close> (Args.typ >> (fn T =>
59621
291934bac95e Thm.cterm_of and Thm.ctyp_of operate on local context;
wenzelm
parents: 59573
diff changeset
    73
    "Thm.ctyp_of ML_context " ^ ML_Syntax.atomic (ML_Syntax.print_typ T))) #>
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
    74
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
    75
  ML_Antiquotation.value_embedded \<^binding>\<open>cterm\<close> (Args.term >> (fn t =>
59621
291934bac95e Thm.cterm_of and Thm.ctyp_of operate on local context;
wenzelm
parents: 59573
diff changeset
    76
    "Thm.cterm_of ML_context " ^ ML_Syntax.atomic (ML_Syntax.print_term t))) #>
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
    77
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
    78
  ML_Antiquotation.value_embedded \<^binding>\<open>cprop\<close> (Args.prop >> (fn t =>
62075
ea3360245939 added ML antiquotation @{method};
wenzelm
parents: 61598
diff changeset
    79
    "Thm.cterm_of ML_context " ^ ML_Syntax.atomic (ML_Syntax.print_term t))) #>
ea3360245939 added ML antiquotation @{method};
wenzelm
parents: 61598
diff changeset
    80
70565
d0b75c59beca added ML antiquotation @{oracle_name};
wenzelm
parents: 69595
diff changeset
    81
  ML_Antiquotation.inline_embedded \<^binding>\<open>oracle_name\<close>
d0b75c59beca added ML antiquotation @{oracle_name};
wenzelm
parents: 69595
diff changeset
    82
    (Args.context -- Scan.lift Args.embedded_position >> (fn (ctxt, (name, pos)) =>
d0b75c59beca added ML antiquotation @{oracle_name};
wenzelm
parents: 69595
diff changeset
    83
      ML_Syntax.print_string (Thm.check_oracle ctxt (name, pos)))) #>
d0b75c59beca added ML antiquotation @{oracle_name};
wenzelm
parents: 69595
diff changeset
    84
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
    85
  ML_Antiquotation.inline_embedded \<^binding>\<open>method\<close>
69349
7cef9e386ffe more accurate positions for "name" (quoted string) and "embedded" (cartouche): refer to content without delimiters, which is e.g. relevant for systematic selection/renaming of scope groups;
wenzelm
parents: 68482
diff changeset
    86
    (Args.context -- Scan.lift Args.embedded_position >> (fn (ctxt, (name, pos)) =>
62075
ea3360245939 added ML antiquotation @{method};
wenzelm
parents: 61598
diff changeset
    87
      ML_Syntax.print_string (Method.check_name ctxt (name, pos)))));
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
    88
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
    89
63553
4a72b37ac4b8 text antiquotation for locales (similar to classes)
haftmann
parents: 63204
diff changeset
    90
(* locales *)
4a72b37ac4b8 text antiquotation for locales (similar to classes)
haftmann
parents: 63204
diff changeset
    91
4a72b37ac4b8 text antiquotation for locales (similar to classes)
haftmann
parents: 63204
diff changeset
    92
val _ = Theory.setup
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
    93
 (ML_Antiquotation.inline_embedded \<^binding>\<open>locale\<close>
69349
7cef9e386ffe more accurate positions for "name" (quoted string) and "embedded" (cartouche): refer to content without delimiters, which is e.g. relevant for systematic selection/renaming of scope groups;
wenzelm
parents: 68482
diff changeset
    94
   (Args.context -- Scan.lift Args.embedded_position >> (fn (ctxt, (name, pos)) =>
63553
4a72b37ac4b8 text antiquotation for locales (similar to classes)
haftmann
parents: 63204
diff changeset
    95
      Locale.check (Proof_Context.theory_of ctxt) (name, pos)
4a72b37ac4b8 text antiquotation for locales (similar to classes)
haftmann
parents: 63204
diff changeset
    96
      |> ML_Syntax.print_string)));
4a72b37ac4b8 text antiquotation for locales (similar to classes)
haftmann
parents: 63204
diff changeset
    97
4a72b37ac4b8 text antiquotation for locales (similar to classes)
haftmann
parents: 63204
diff changeset
    98
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
    99
(* type classes *)
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   100
63120
629a4c5e953e embedded content may be delimited via cartouches;
wenzelm
parents: 62900
diff changeset
   101
fun class syn = Args.context -- Scan.lift Args.embedded_inner_syntax >> (fn (ctxt, s) =>
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   102
  Proof_Context.read_class ctxt s
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   103
  |> syn ? Lexicon.mark_class
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   104
  |> ML_Syntax.print_string);
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   105
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   106
val _ = Theory.setup
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
   107
 (ML_Antiquotation.inline_embedded \<^binding>\<open>class\<close> (class false) #>
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
   108
  ML_Antiquotation.inline_embedded \<^binding>\<open>class_syntax\<close> (class true) #>
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   109
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
   110
  ML_Antiquotation.inline_embedded \<^binding>\<open>sort\<close>
63120
629a4c5e953e embedded content may be delimited via cartouches;
wenzelm
parents: 62900
diff changeset
   111
    (Args.context -- Scan.lift Args.embedded_inner_syntax >> (fn (ctxt, s) =>
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   112
      ML_Syntax.atomic (ML_Syntax.print_sort (Syntax.read_sort ctxt s)))));
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   113
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   114
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   115
(* type constructors *)
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   116
69349
7cef9e386ffe more accurate positions for "name" (quoted string) and "embedded" (cartouche): refer to content without delimiters, which is e.g. relevant for systematic selection/renaming of scope groups;
wenzelm
parents: 68482
diff changeset
   117
fun type_name kind check = Args.context -- Scan.lift Args.embedded_token
7cef9e386ffe more accurate positions for "name" (quoted string) and "embedded" (cartouche): refer to content without delimiters, which is e.g. relevant for systematic selection/renaming of scope groups;
wenzelm
parents: 68482
diff changeset
   118
  >> (fn (ctxt, tok) =>
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   119
    let
69349
7cef9e386ffe more accurate positions for "name" (quoted string) and "embedded" (cartouche): refer to content without delimiters, which is e.g. relevant for systematic selection/renaming of scope groups;
wenzelm
parents: 68482
diff changeset
   120
      val s = Token.inner_syntax_of tok;
7cef9e386ffe more accurate positions for "name" (quoted string) and "embedded" (cartouche): refer to content without delimiters, which is e.g. relevant for systematic selection/renaming of scope groups;
wenzelm
parents: 68482
diff changeset
   121
      val (_, pos) = Input.source_content (Token.input_of tok);
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   122
      val Type (c, _) = Proof_Context.read_type_name {proper = true, strict = false} ctxt s;
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   123
      val decl = Type.the_decl (Proof_Context.tsig_of ctxt) (c, pos);
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   124
      val res =
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   125
        (case try check (c, decl) of
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   126
          SOME res => res
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   127
        | NONE => error ("Not a " ^ kind ^ ": " ^ quote c ^ Position.here pos));
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   128
    in ML_Syntax.print_string res end);
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   129
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   130
val _ = Theory.setup
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
   131
 (ML_Antiquotation.inline_embedded \<^binding>\<open>type_name\<close>
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   132
    (type_name "logical type" (fn (c, Type.LogicalType _) => c)) #>
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
   133
  ML_Antiquotation.inline_embedded \<^binding>\<open>type_abbrev\<close>
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   134
    (type_name "type abbreviation" (fn (c, Type.Abbreviation _) => c)) #>
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
   135
  ML_Antiquotation.inline_embedded \<^binding>\<open>nonterminal\<close>
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   136
    (type_name "nonterminal" (fn (c, Type.Nonterminal) => c)) #>
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
   137
  ML_Antiquotation.inline_embedded \<^binding>\<open>type_syntax\<close>
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   138
    (type_name "type" (fn (c, _) => Lexicon.mark_type c)));
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   139
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   140
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   141
(* constants *)
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   142
69349
7cef9e386ffe more accurate positions for "name" (quoted string) and "embedded" (cartouche): refer to content without delimiters, which is e.g. relevant for systematic selection/renaming of scope groups;
wenzelm
parents: 68482
diff changeset
   143
fun const_name check = Args.context -- Scan.lift Args.embedded_token
7cef9e386ffe more accurate positions for "name" (quoted string) and "embedded" (cartouche): refer to content without delimiters, which is e.g. relevant for systematic selection/renaming of scope groups;
wenzelm
parents: 68482
diff changeset
   144
  >> (fn (ctxt, tok) =>
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   145
    let
69349
7cef9e386ffe more accurate positions for "name" (quoted string) and "embedded" (cartouche): refer to content without delimiters, which is e.g. relevant for systematic selection/renaming of scope groups;
wenzelm
parents: 68482
diff changeset
   146
      val s = Token.inner_syntax_of tok;
7cef9e386ffe more accurate positions for "name" (quoted string) and "embedded" (cartouche): refer to content without delimiters, which is e.g. relevant for systematic selection/renaming of scope groups;
wenzelm
parents: 68482
diff changeset
   147
      val (_, pos) = Input.source_content (Token.input_of tok);
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   148
      val Const (c, _) = Proof_Context.read_const {proper = true, strict = false} ctxt s;
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   149
      val res = check (Proof_Context.consts_of ctxt, c)
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   150
        handle TYPE (msg, _, _) => error (msg ^ Position.here pos);
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   151
    in ML_Syntax.print_string res end);
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   152
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   153
val _ = Theory.setup
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
   154
 (ML_Antiquotation.inline_embedded \<^binding>\<open>const_name\<close>
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   155
    (const_name (fn (consts, c) => (Consts.the_const consts c; c))) #>
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
   156
  ML_Antiquotation.inline_embedded \<^binding>\<open>const_abbrev\<close>
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   157
    (const_name (fn (consts, c) => (Consts.the_abbreviation consts c; c))) #>
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
   158
  ML_Antiquotation.inline_embedded \<^binding>\<open>const_syntax\<close>
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   159
    (const_name (fn (_, c) => Lexicon.mark_const c)) #>
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   160
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
   161
  ML_Antiquotation.inline_embedded \<^binding>\<open>syntax_const\<close>
69349
7cef9e386ffe more accurate positions for "name" (quoted string) and "embedded" (cartouche): refer to content without delimiters, which is e.g. relevant for systematic selection/renaming of scope groups;
wenzelm
parents: 68482
diff changeset
   162
    (Args.context -- Scan.lift Args.embedded_position >> (fn (ctxt, (c, pos)) =>
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   163
      if is_some (Syntax.lookup_const (Proof_Context.syn_of ctxt) c)
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   164
      then ML_Syntax.print_string c
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   165
      else error ("Unknown syntax const: " ^ quote c ^ Position.here pos))) #>
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   166
69595
ec135235fbcc mark for isabelle update -u control_cartouches;
wenzelm
parents: 69592
diff changeset
   167
  ML_Antiquotation.inline_embedded \<^binding>\<open>const\<close>
63120
629a4c5e953e embedded content may be delimited via cartouches;
wenzelm
parents: 62900
diff changeset
   168
    (Args.context -- Scan.lift (Parse.position Args.embedded_inner_syntax) -- Scan.optional
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   169
        (Scan.lift (Args.$$$ "(") |-- Parse.enum1' "," Args.typ --| Scan.lift (Args.$$$ ")")) []
56251
73e2e1912571 tuned message;
wenzelm
parents: 56205
diff changeset
   170
      >> (fn ((ctxt, (raw_c, pos)), Ts) =>
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   171
        let
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   172
          val Const (c, _) =
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   173
            Proof_Context.read_const {proper = true, strict = true} ctxt raw_c;
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   174
          val consts = Proof_Context.consts_of ctxt;
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   175
          val n = length (Consts.typargs consts (c, Consts.type_scheme consts c));
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   176
          val _ = length Ts <> n andalso
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   177
            error ("Constant requires " ^ string_of_int n ^ " type argument(s): " ^
56251
73e2e1912571 tuned message;
wenzelm
parents: 56205
diff changeset
   178
              quote c ^ enclose "(" ")" (commas (replicate n "_")) ^ Position.here pos);
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   179
          val const = Const (c, Consts.instance consts (c, Ts));
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   180
        in ML_Syntax.atomic (ML_Syntax.print_term const) end)));
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   181
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   182
58634
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   183
(* basic combinators *)
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   184
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   185
local
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   186
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   187
val parameter = Parse.position Parse.nat >> (fn (n, pos) =>
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   188
  if n > 1 then n else error ("Bad parameter: " ^ string_of_int n ^ Position.here pos));
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   189
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   190
fun indices n = map string_of_int (1 upto n);
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   191
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   192
fun empty n = replicate_string n " []";
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   193
fun dummy n = replicate_string n " _";
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   194
fun vars x n = implode (map (fn a => " " ^ x ^ a) (indices n));
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   195
fun cons n = implode (map (fn a => " (x" ^ a ^ " :: xs" ^ a ^ ")") (indices n));
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   196
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   197
val tuple = enclose "(" ")" o commas;
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   198
fun tuple_empty n = tuple (replicate n "[]");
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   199
fun tuple_vars x n = tuple (map (fn a => x ^ a) (indices n));
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   200
fun tuple_cons n = "(" ^ tuple_vars "x" n ^ " :: xs)"
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   201
fun cons_tuple n = tuple (map (fn a => "x" ^ a ^ " :: xs" ^ a) (indices n));
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   202
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   203
in
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   204
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   205
val _ = Theory.setup
67147
dea94b1aabc3 prefer control symbol antiquotations;
wenzelm
parents: 67146
diff changeset
   206
 (ML_Antiquotation.value \<^binding>\<open>map\<close>
58634
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   207
    (Scan.lift parameter >> (fn n =>
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   208
      "fn f =>\n\
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   209
      \  let\n\
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   210
      \    fun map _" ^ empty n ^ " = []\n\
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   211
      \      | map f" ^ cons n ^ " = f" ^ vars "x" n ^ " :: map f" ^ vars "xs" n ^ "\n\
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   212
      \      | map _" ^  dummy n ^ " = raise ListPair.UnequalLengths\n" ^
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   213
      "  in map f end")) #>
67147
dea94b1aabc3 prefer control symbol antiquotations;
wenzelm
parents: 67146
diff changeset
   214
  ML_Antiquotation.value \<^binding>\<open>fold\<close>
58634
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   215
    (Scan.lift parameter >> (fn n =>
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   216
      "fn f =>\n\
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   217
      \  let\n\
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   218
      \    fun fold _" ^ empty n ^ " a = a\n\
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   219
      \      | fold f" ^ cons n ^ " a = fold f" ^ vars "xs" n ^ " (f" ^ vars "x" n ^ " a)\n\
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   220
      \      | fold _" ^  dummy n ^ " _ = raise ListPair.UnequalLengths\n" ^
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   221
      "  in fold f end")) #>
67147
dea94b1aabc3 prefer control symbol antiquotations;
wenzelm
parents: 67146
diff changeset
   222
  ML_Antiquotation.value \<^binding>\<open>fold_map\<close>
58634
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   223
    (Scan.lift parameter >> (fn n =>
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   224
      "fn f =>\n\
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   225
      \  let\n\
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   226
      \    fun fold_map _" ^ empty n ^ " a = ([], a)\n\
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   227
      \      | fold_map f" ^ cons n ^ " a =\n\
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   228
      \          let\n\
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   229
      \            val (x, a') = f" ^ vars "x" n ^ " a\n\
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   230
      \            val (xs, a'') = fold_map f" ^ vars "xs" n ^ " a'\n\
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   231
      \          in (x :: xs, a'') end\n\
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   232
      \      | fold_map _" ^  dummy n ^ " _ = raise ListPair.UnequalLengths\n" ^
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   233
      "  in fold_map f end")) #>
67147
dea94b1aabc3 prefer control symbol antiquotations;
wenzelm
parents: 67146
diff changeset
   234
  ML_Antiquotation.value \<^binding>\<open>split_list\<close>
58634
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   235
    (Scan.lift parameter >> (fn n =>
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   236
      "fn list =>\n\
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   237
      \  let\n\
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   238
      \    fun split_list [] =" ^ tuple_empty n ^ "\n\
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   239
      \      | split_list" ^ tuple_cons n ^ " =\n\
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   240
      \          let val" ^ tuple_vars "xs" n ^ " = split_list xs\n\
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   241
      \          in " ^ cons_tuple n ^ "end\n\
59057
5b649fb2f2e1 added ML antiquotation @{apply n} or @{apply n(k)};
wenzelm
parents: 58978
diff changeset
   242
      \  in split_list list end")) #>
67147
dea94b1aabc3 prefer control symbol antiquotations;
wenzelm
parents: 67146
diff changeset
   243
  ML_Antiquotation.value \<^binding>\<open>apply\<close>
59057
5b649fb2f2e1 added ML antiquotation @{apply n} or @{apply n(k)};
wenzelm
parents: 58978
diff changeset
   244
    (Scan.lift (parameter -- Scan.option (Args.parens (Parse.position Parse.nat))) >>
5b649fb2f2e1 added ML antiquotation @{apply n} or @{apply n(k)};
wenzelm
parents: 58978
diff changeset
   245
      (fn (n, opt_index) =>
5b649fb2f2e1 added ML antiquotation @{apply n} or @{apply n(k)};
wenzelm
parents: 58978
diff changeset
   246
        let
5b649fb2f2e1 added ML antiquotation @{apply n} or @{apply n(k)};
wenzelm
parents: 58978
diff changeset
   247
          val cond =
5b649fb2f2e1 added ML antiquotation @{apply n} or @{apply n(k)};
wenzelm
parents: 58978
diff changeset
   248
            (case opt_index of
5b649fb2f2e1 added ML antiquotation @{apply n} or @{apply n(k)};
wenzelm
parents: 58978
diff changeset
   249
              NONE => K true
5b649fb2f2e1 added ML antiquotation @{apply n} or @{apply n(k)};
wenzelm
parents: 58978
diff changeset
   250
            | SOME (index, index_pos) =>
5b649fb2f2e1 added ML antiquotation @{apply n} or @{apply n(k)};
wenzelm
parents: 58978
diff changeset
   251
                if 1 <= index andalso index <= n then equal (string_of_int index)
5b649fb2f2e1 added ML antiquotation @{apply n} or @{apply n(k)};
wenzelm
parents: 58978
diff changeset
   252
                else error ("Bad index: " ^ string_of_int index ^ Position.here index_pos));
5b649fb2f2e1 added ML antiquotation @{apply n} or @{apply n(k)};
wenzelm
parents: 58978
diff changeset
   253
        in
5b649fb2f2e1 added ML antiquotation @{apply n} or @{apply n(k)};
wenzelm
parents: 58978
diff changeset
   254
          "fn f => fn " ^ tuple_vars "x" n ^ " => " ^
5b649fb2f2e1 added ML antiquotation @{apply n} or @{apply n(k)};
wenzelm
parents: 58978
diff changeset
   255
            tuple (map (fn a => (if cond a then "f x" else "x") ^ a) (indices n))
5b649fb2f2e1 added ML antiquotation @{apply n} or @{apply n(k)};
wenzelm
parents: 58978
diff changeset
   256
        end)));
58634
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   257
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   258
end;
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   259
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58632
diff changeset
   260
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   261
(* outer syntax *)
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   262
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   263
val _ = Theory.setup
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
   264
 (ML_Antiquotation.value_embedded \<^binding>\<open>keyword\<close>
69349
7cef9e386ffe more accurate positions for "name" (quoted string) and "embedded" (cartouche): refer to content without delimiters, which is e.g. relevant for systematic selection/renaming of scope groups;
wenzelm
parents: 68482
diff changeset
   265
    (Args.context --
7cef9e386ffe more accurate positions for "name" (quoted string) and "embedded" (cartouche): refer to content without delimiters, which is e.g. relevant for systematic selection/renaming of scope groups;
wenzelm
parents: 68482
diff changeset
   266
      Scan.lift (Parse.embedded_position || Parse.position (Parse.keyword_with (K true)))
64594
4719f13989df more permissive syntax;
wenzelm
parents: 63553
diff changeset
   267
      >> (fn (ctxt, (name, pos)) =>
4719f13989df more permissive syntax;
wenzelm
parents: 63553
diff changeset
   268
        if Keyword.is_keyword (Thy_Header.get_keywords' ctxt) name then
4719f13989df more permissive syntax;
wenzelm
parents: 63553
diff changeset
   269
          (Context_Position.report ctxt pos (Token.keyword_markup (true, Markup.keyword2) name);
4719f13989df more permissive syntax;
wenzelm
parents: 63553
diff changeset
   270
           "Parse.$$$ " ^ ML_Syntax.print_string name)
4719f13989df more permissive syntax;
wenzelm
parents: 63553
diff changeset
   271
        else error ("Bad outer syntax keyword " ^ quote name ^ Position.here pos))) #>
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69349
diff changeset
   272
  ML_Antiquotation.value_embedded \<^binding>\<open>command_keyword\<close>
69349
7cef9e386ffe more accurate positions for "name" (quoted string) and "embedded" (cartouche): refer to content without delimiters, which is e.g. relevant for systematic selection/renaming of scope groups;
wenzelm
parents: 68482
diff changeset
   273
    (Args.context -- Scan.lift Parse.embedded_position >> (fn (ctxt, (name, pos)) =>
59934
b65c4370f831 more position information and PIDE markup for command keywords;
wenzelm
parents: 59878
diff changeset
   274
      (case Keyword.command_markup (Thy_Header.get_keywords' ctxt) name of
b65c4370f831 more position information and PIDE markup for command keywords;
wenzelm
parents: 59878
diff changeset
   275
        SOME markup =>
b65c4370f831 more position information and PIDE markup for command keywords;
wenzelm
parents: 59878
diff changeset
   276
         (Context_Position.reports ctxt [(pos, markup), (pos, Markup.keyword1)];
b65c4370f831 more position information and PIDE markup for command keywords;
wenzelm
parents: 59878
diff changeset
   277
          ML_Syntax.print_pair ML_Syntax.print_string ML_Syntax.print_position (name, pos))
b65c4370f831 more position information and PIDE markup for command keywords;
wenzelm
parents: 59878
diff changeset
   278
      | NONE => error ("Bad outer syntax command " ^ quote name ^ Position.here pos)))));
56205
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   279
ceb8a93460b7 clarified modules;
wenzelm
parents:
diff changeset
   280
end;