Theory Misc_Antiquotation
theory Misc_Antiquotation
  imports Main
begin
section ‹Various Antiquotations›
subsection ‹Antiquotations for terms with schematic variables›
setup ‹
let
  val parser = Args.context -- Scan.lift Parse.embedded_inner_syntax
  fun pattern (ctxt, str) =
     str |> Proof_Context.read_term_pattern ctxt
         |> ML_Syntax.print_term
         |> ML_Syntax.atomic
in
 ML_Antiquotation.inline @{binding "pattern"} (parser >> pattern)
end
›
ML ‹@{pattern "λ(a,b,c). ?g a b c"}›
setup ‹
let
type style = term -> term;
fun pretty_term_style ctxt (style: style, t) =
  Document_Output.pretty_term ctxt (style t);
val basic_entity = Document_Output.antiquotation_pretty_source;
in
(basic_entity \<^binding>‹pattern› (Term_Style.parse -- Args.term_pattern) pretty_term_style)
end
›
subsection ‹Antiquotation for types with schematic variables›
setup ‹
let
  val parser = Args.context -- Scan.lift Parse.embedded_inner_syntax
  fun typ_pattern (ctxt, str) =
    let
      val ctxt' = Proof_Context.set_mode Proof_Context.mode_schematic ctxt
    in
      str |> Proof_Context.read_typ ctxt'
          |> ML_Syntax.print_typ
          |> ML_Syntax.atomic
    end
in
 ML_Antiquotation.inline @{binding "typ_pattern"} (parser >> typ_pattern)
end
›
ML ‹@{typ_pattern "?'a list"}›
ML ‹Sign.typ_instance @{theory} (@{typ "'a list"}, @{typ_pattern "?'a list"})›
end