theory Cartouche_Examples imports Main
keywords "cartouche" :: diag begin
subsection‹Regular outer syntax›
text‹Text cartouches may be used in the outer syntax category ‹text›, as alternative to the traditional ‹verbatim›tokens. An example is this text block.›
notepad begin txt‹Cartouches work as additional syntax for embedded language tokens (types, terms, props) and as a replacement for the ‹altstring›category (for literal fact references). For example:›
fix x y :: 'a assume‹x = y› note‹x = y› have‹x = y›by (rule ‹x = y›) from‹x = y›have‹x = y› .
txt‹Of course, this can be nested inside formal comments and antiquotations, e.g. like this @{thm ‹x = y›} or this @{thm sym [OF ‹x = y›]}.›
have‹x = y› by (tactic ‹resolve_tac 🍋 @{thms ‹x = y›} 1›) 🍋‹more cartouches involving ML› end
subsection‹Outer syntax: cartouche within command syntax›
ML ‹ Outer_Syntax.command 🍋‹cartouche›"" (Parse.cartouche >> (fn s => Toplevel.keep (fn _ => writeln s))) ›
cartouche ‹abc›
cartouche ‹abc ‹αβγ›xzy›
subsection‹Inner syntax: string literals via cartouche›
ML ‹ local fun mk_char (s, pos) = let val c = if Symbol.is_ascii s then ord s else if s = "🍋" then 10 else error ("String literal contains illegal symbol: " ^ quote s ^ Position.here pos); in list_comb (Syntax.const 🍋‹Char›, String_Syntax.mk_bits_syntax 8 c) end; fun mk_string [] = Const (🍋‹Nil›,🍋‹string›) | mk_string (s :: ss) = Syntax.const 🍋‹Cons›$ mk_char s $ mk_string ss; in fun string_tr content args = let fun err () = raise TERM ("string_tr", args) in (case args of [(c as Const (🍋‹_constrain›, _)) $ Free (s, _) $ p] => (case Term_Position.decode_position1 p of SOME {pos, ...} => c $ mk_string (content (s, pos)) $ p | NONE => err ()) | _ => err ()) end; end; ›
subsection‹Proof method syntax: ML tactic expression›
ML ‹ structure ML_Tactic: sig val set: (Proof.context -> tactic) -> Proof.context -> Proof.context val ml_tactic: Input.source -> Proof.context -> tactic end = struct structure Data = Proof_Data(type T = Proof.context -> tactic fun init _ = K no_tac); val set = Data.put; fun ml_tactic source ctxt = let val ctxt' = ctxt |> Context.proof_map (ML_Context.expression (Input.pos_of source) (ML_Lex.read "Theory.local_setup (ML_Tactic.set (fn ctxt: Proof.context => (" @ ML_Lex.read_source source @ ML_Lex.read ")))")); in Data.get ctxt' ctxt end; end ›
subsubsection ‹Explicit version: method with cartouche argument›
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.