(* Title: Pure/Tools/print_operation.ML
Author: Makarius
Print operations as asynchronous query.
*)
signature PRINT_OPERATION =
sig
val register: string -> string -> (Toplevel.state -> Pretty.T list) -> unit
end;
structure Print_Operation: PRINT_OPERATION =
struct
(* maintain print operations *)
local
val print_operations =
Synchronized.var "print_operations"
([]: (string * (string * (Toplevel.state -> Pretty.T list))) list);
fun report () =
Output.try_protocol_message Markup.print_operations
let
val yxml =
Synchronized.value print_operations
|> map (fn (x, (y, _)) => (x, y)) |> rev
|> let open XML.Encode in list (pair string string) end
|> YXML.string_of_body;
in [yxml] end;
val _ = Isabelle_Process.protocol_command "print_operations" (fn [] => report ());
val _ = Session.protocol_handler "isabelle.Print_Operation$Handler";
in
fun register name description pr =
(Synchronized.change print_operations (fn tab =>
(if not (AList.defined (op =) tab name) then ()
else warning ("Redefining print operation: " ^ quote name);
AList.update (op =) (name, (description, pr)) tab));
report ());
val _ =
Query_Operation.register {name = "print_operation", pri = Task_Queue.urgent_pri}
(fn {state, args, writeln_result, ...} =>
let
val _ = Toplevel.context_of state handle Toplevel.UNDEF => error "Unknown context";
fun err s = Pretty.mark_str (Markup.bad (), s);
fun print name =
(case AList.lookup (op =) (Synchronized.value print_operations) name of
SOME (_, pr) => (pr state handle Toplevel.UNDEF => [err "Unknown context"])
| NONE => [err ("Unknown print operation: " ^ quote name)]);
in writeln_result (Pretty.string_of (Pretty.chunks (maps print args))) end);
end;
(* common print operations *)
val _ =
register "context" "context of local theory target" Toplevel.pretty_context;
val _ =
register "cases" "cases of proof context"
(Proof_Context.pretty_cases o Toplevel.context_of);
val _ =
register "terms" "term bindings of proof context"
(Proof_Context.pretty_term_bindings o Toplevel.context_of);
val _ =
register "theorems" "theorems of local theory or proof context"
(Isar_Cmd.pretty_theorems false);
end;