src/Pure/ML/ml_antiquotation.ML
author nipkow
Tue, 05 Nov 2019 14:57:41 +0100
changeset 71033 c1b63124245c
parent 69592 a80d8ec6c998
child 73549 a2c589d5e1e4
permissions -rw-r--r--
tuned
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
56072
31e427387ab5 tuned signature -- clarified module name;
wenzelm
parents: 56071
diff changeset
     1
(*  Title:      Pure/ML/ml_antiquotation.ML
27340
3de9f20f4e28 Common ML antiquotations.
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
3de9f20f4e28 Common ML antiquotations.
wenzelm
parents:
diff changeset
     3
56205
ceb8a93460b7 clarified modules;
wenzelm
parents: 56072
diff changeset
     4
ML antiquotations.
27340
3de9f20f4e28 Common ML antiquotations.
wenzelm
parents:
diff changeset
     5
*)
3de9f20f4e28 Common ML antiquotations.
wenzelm
parents:
diff changeset
     6
56072
31e427387ab5 tuned signature -- clarified module name;
wenzelm
parents: 56071
diff changeset
     7
signature ML_ANTIQUOTATION =
27340
3de9f20f4e28 Common ML antiquotations.
wenzelm
parents:
diff changeset
     8
sig
56205
ceb8a93460b7 clarified modules;
wenzelm
parents: 56072
diff changeset
     9
  val declaration: binding -> 'a context_parser ->
58011
bc6bced136e5 tuned signature -- moved type src to Token, without aliases;
wenzelm
parents: 57832
diff changeset
    10
    (Token.src -> 'a -> Proof.context -> ML_Context.decl * Proof.context) ->
56205
ceb8a93460b7 clarified modules;
wenzelm
parents: 56072
diff changeset
    11
    theory -> theory
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    12
  val declaration_embedded: binding -> 'a context_parser ->
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    13
    (Token.src -> 'a -> Proof.context -> ML_Context.decl * Proof.context) ->
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    14
    theory -> theory
43560
d1650e3720fd ML antiquotations are managed as theory data, with proper name space and entity markup;
wenzelm
parents: 43326
diff changeset
    15
  val inline: binding -> string context_parser -> theory -> theory
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    16
  val inline_embedded: binding -> string context_parser -> theory -> theory
43560
d1650e3720fd ML antiquotations are managed as theory data, with proper name space and entity markup;
wenzelm
parents: 43326
diff changeset
    17
  val value: binding -> string context_parser -> theory -> theory
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    18
  val value_embedded: binding -> string context_parser -> theory -> theory
27340
3de9f20f4e28 Common ML antiquotations.
wenzelm
parents:
diff changeset
    19
end;
3de9f20f4e28 Common ML antiquotations.
wenzelm
parents:
diff changeset
    20
56072
31e427387ab5 tuned signature -- clarified module name;
wenzelm
parents: 56071
diff changeset
    21
structure ML_Antiquotation: ML_ANTIQUOTATION =
27340
3de9f20f4e28 Common ML antiquotations.
wenzelm
parents:
diff changeset
    22
struct
3de9f20f4e28 Common ML antiquotations.
wenzelm
parents:
diff changeset
    23
56205
ceb8a93460b7 clarified modules;
wenzelm
parents: 56072
diff changeset
    24
(* define antiquotations *)
ceb8a93460b7 clarified modules;
wenzelm
parents: 56072
diff changeset
    25
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    26
local
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    27
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    28
fun gen_declaration name embedded scan body =
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    29
  ML_Context.add_antiquotation name embedded
56205
ceb8a93460b7 clarified modules;
wenzelm
parents: 56072
diff changeset
    30
    (fn src => fn orig_ctxt =>
58011
bc6bced136e5 tuned signature -- moved type src to Token, without aliases;
wenzelm
parents: 57832
diff changeset
    31
      let val (x, _) = Token.syntax scan src orig_ctxt
56205
ceb8a93460b7 clarified modules;
wenzelm
parents: 56072
diff changeset
    32
      in body src x orig_ctxt end);
27340
3de9f20f4e28 Common ML antiquotations.
wenzelm
parents:
diff changeset
    33
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    34
fun gen_inline name embedded scan =
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    35
  gen_declaration name embedded scan (fn _ => fn s => fn ctxt => (K ("", s), ctxt));
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    36
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    37
fun gen_value name embedded scan =
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    38
  gen_declaration name embedded scan (fn _ => ML_Context.value_decl (Binding.name_of name));
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    39
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    40
in
27340
3de9f20f4e28 Common ML antiquotations.
wenzelm
parents:
diff changeset
    41
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    42
fun declaration name = gen_declaration name false;
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    43
fun declaration_embedded name = gen_declaration name true;
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    44
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    45
fun inline name = gen_inline name false;
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    46
fun inline_embedded name = gen_inline name true;
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    47
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    48
fun value name = gen_value name false;
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    49
fun value_embedded name = gen_value name true;
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    50
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    51
end;
27340
3de9f20f4e28 Common ML antiquotations.
wenzelm
parents:
diff changeset
    52
3de9f20f4e28 Common ML antiquotations.
wenzelm
parents:
diff changeset
    53
56205
ceb8a93460b7 clarified modules;
wenzelm
parents: 56072
diff changeset
    54
(* basic antiquotations *)
27340
3de9f20f4e28 Common ML antiquotations.
wenzelm
parents:
diff changeset
    55
53171
a5e54d4d9081 added Theory.setup convenience;
wenzelm
parents: 53170
diff changeset
    56
val _ = Theory.setup
64556
851ae0e7b09c more symbols;
wenzelm
parents: 62900
diff changeset
    57
 (declaration (Binding.make ("here", \<^here>)) (Scan.succeed ())
59112
e670969f34df expand ML cartouches to Input.source;
wenzelm
parents: 58011
diff changeset
    58
    (fn src => fn () =>
e670969f34df expand ML cartouches to Input.source;
wenzelm
parents: 58011
diff changeset
    59
      ML_Context.value_decl "position" (ML_Syntax.print_position (#2 (Token.name_of_src src)))) #>
56071
2ffdedb0c044 added ML antiquotation @{here};
wenzelm
parents: 56069
diff changeset
    60
64556
851ae0e7b09c more symbols;
wenzelm
parents: 62900
diff changeset
    61
  inline (Binding.make ("make_string", \<^here>)) (Args.context >> K ML_Pretty.make_string_fn) #>
62662
291cc01f56f5 @{make_string} is available during Pure bootstrap;
wenzelm
parents: 59112
diff changeset
    62
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    63
  value_embedded (Binding.make ("binding", \<^here>))
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: 67146
diff changeset
    64
    (Scan.lift (Parse.input Args.embedded) >> (ML_Syntax.make_binding o Input.source_content)) #>
62850
1f1a2c33ccf4 clarified conditional compilation;
wenzelm
parents: 62662
diff changeset
    65
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    66
  value_embedded (Binding.make ("cartouche", \<^here>))
62850
1f1a2c33ccf4 clarified conditional compilation;
wenzelm
parents: 62662
diff changeset
    67
    (Scan.lift Args.cartouche_input >> (fn source =>
1f1a2c33ccf4 clarified conditional compilation;
wenzelm
parents: 62662
diff changeset
    68
      "Input.source true " ^ ML_Syntax.print_string (Input.text_of source) ^ " " ^
69470
c8c3285f1294 more ML antiquotations;
wenzelm
parents: 69349
diff changeset
    69
        ML_Syntax.atomic (ML_Syntax.print_range (Input.range_of source)))) #>
c8c3285f1294 more ML antiquotations;
wenzelm
parents: 69349
diff changeset
    70
69592
a80d8ec6c998 support for isabelle update -u control_cartouches;
wenzelm
parents: 69470
diff changeset
    71
  inline_embedded (Binding.make ("verbatim", \<^here>))
69470
c8c3285f1294 more ML antiquotations;
wenzelm
parents: 69349
diff changeset
    72
    (Scan.lift Args.embedded >> ML_Syntax.print_string));
46948
aae5566d6756 added ML antiquotation @{keyword};
wenzelm
parents: 43794
diff changeset
    73
27340
3de9f20f4e28 Common ML antiquotations.
wenzelm
parents:
diff changeset
    74
end;