haftmann@28440: (* Title: Doc/more_antiquote.ML haftmann@28440: ID: $Id$ haftmann@28440: Author: Florian Haftmann, TU Muenchen haftmann@28440: haftmann@28440: More antiquotations. haftmann@28440: *) haftmann@28440: haftmann@28440: signature MORE_ANTIQUOTE = haftmann@28440: sig haftmann@28440: val verbatim_lines: string list -> string haftmann@28440: end; haftmann@28440: haftmann@28440: structure More_Antiquote : MORE_ANTIQUOTE = haftmann@28440: struct haftmann@28440: haftmann@28440: structure O = ThyOutput; haftmann@28440: haftmann@28440: (* printing verbatim lines *) haftmann@28440: haftmann@28440: val verbatim_line = space_implode "\\verb,|," o map (enclose "\\verb|" "|") o space_explode "|"; haftmann@28440: val verbatim_lines = rev haftmann@28440: #> dropwhile (fn s => s = "") haftmann@28440: #> rev haftmann@28440: #> map verbatim_line #> space_implode "\\newline%\n" haftmann@28440: #> prefix "\\isaverbatim%\n\\noindent%\n" haftmann@28440: haftmann@28440: haftmann@28440: (* class antiquotation *) haftmann@28440: haftmann@28440: local haftmann@28440: haftmann@28634: val pr_text = enclose "\\isa{" "}" o Pretty.output o Pretty.str; haftmann@28634: haftmann@28634: fun pr_class ctxt = Sign.read_class (ProofContext.theory_of ctxt) haftmann@28634: #> Sign.extern_class (ProofContext.theory_of ctxt) haftmann@28634: #> pr_text; haftmann@28634: haftmann@28634: fun pr_type ctxt = Sign.intern_type (ProofContext.theory_of ctxt) haftmann@28634: #> tap (Sign.arity_number (ProofContext.theory_of ctxt)) haftmann@28634: #> Sign.extern_type (ProofContext.theory_of ctxt) haftmann@28634: #> pr_text; haftmann@28440: haftmann@28440: in haftmann@28440: haftmann@28440: val _ = O.add_commands haftmann@28634: [("class", ThyOutput.args (Scan.lift Args.name) (K pr_class)), haftmann@28634: ("type", ThyOutput.args (Scan.lift Args.name) (K pr_type))] haftmann@28440: haftmann@28440: end; haftmann@28440: haftmann@28440: haftmann@28440: (* code antiquotation *) haftmann@28440: haftmann@28440: local haftmann@28440: haftmann@28440: val parse_const_terms = Scan.repeat1 Args.term haftmann@28440: >> (fn ts => fn thy => map (Code_Unit.check_const thy) ts); haftmann@28440: val parse_consts = Scan.lift (Args.parens (Args.$$$ "consts")) |-- parse_const_terms haftmann@28440: >> (fn mk_cs => fn thy => map (Code_Name.const thy) (mk_cs thy)); haftmann@28440: val parse_types = Scan.lift (Args.parens (Args.$$$ "types") |-- Scan.repeat1 Args.name) haftmann@28440: >> (fn tycos => fn thy => map (Code_Name.tyco thy o Sign.intern_type thy) tycos); haftmann@28440: val parse_classes = Scan.lift (Args.parens (Args.$$$ "classes") |-- Scan.repeat1 Args.name) haftmann@28440: >> (fn classes => fn thy => map (Code_Name.class thy o Sign.intern_class thy) classes); haftmann@28440: val parse_instances = Scan.lift (Args.parens (Args.$$$ "instances") |-- Scan.repeat1 (Args.name --| Args.$$$ "::" -- Args.name)) haftmann@28440: >> (fn insts => fn thy => map (Code_Name.instance thy o apsnd (Sign.intern_type thy) o apfst (Sign.intern_class thy) o swap) insts); haftmann@28440: val parse_names = parse_consts || parse_types || parse_classes || parse_instances; haftmann@28440: haftmann@28440: fun code_stmts src ctxt ((mk_cs, mk_stmtss), target) = haftmann@28440: Code_Target.code_of (ProofContext.theory_of ctxt) haftmann@28440: target "Example" (mk_cs (ProofContext.theory_of ctxt)) haftmann@28440: (maps (fn f => f (ProofContext.theory_of ctxt)) mk_stmtss) haftmann@28440: |> split_lines haftmann@28440: |> verbatim_lines; haftmann@28440: haftmann@28440: in haftmann@28440: haftmann@28440: val _ = O.add_commands haftmann@28440: [("code_stmts", O.args haftmann@28440: (parse_const_terms -- Scan.repeat parse_names -- Scan.lift (Args.parens Args.name)) haftmann@28440: code_stmts)] haftmann@28440: haftmann@28440: end haftmann@28440: haftmann@28440: end;