author | wenzelm |
Mon, 21 Jul 2014 16:58:12 +0200 | |
changeset 57593 | 2f7d91242b99 |
parent 57415 | e721124f1b1e |
child 57604 | 30885e25c6de |
permissions | -rw-r--r-- |
56864 | 1 |
(* Title: Pure/Tools/print_operation.ML |
2 |
Author: Makarius |
|
3 |
||
4 |
Print operations as asynchronous query. |
|
5 |
*) |
|
6 |
||
7 |
||
8 |
signature PRINT_OPERATION = |
|
9 |
sig |
|
10 |
val register: string -> string -> (Toplevel.state -> string) -> unit |
|
11 |
end; |
|
12 |
||
13 |
structure Print_Operation: PRINT_OPERATION = |
|
14 |
struct |
|
15 |
||
16 |
(* maintain print operations *) |
|
17 |
||
18 |
local |
|
19 |
||
20 |
val print_operations = |
|
21 |
Synchronized.var "print_operations" |
|
56867 | 22 |
([]: (string * (string * (Toplevel.state -> string))) list); |
56864 | 23 |
|
24 |
fun report () = |
|
25 |
Output.try_protocol_message Markup.print_operations |
|
26 |
let |
|
27 |
val yxml = |
|
56867 | 28 |
Synchronized.value print_operations |
29 |
|> map (fn (x, (y, _)) => (x, y)) |> rev |
|
56864 | 30 |
|> let open XML.Encode in list (pair string string) end |
31 |
|> YXML.string_of_body; |
|
32 |
in [yxml] end; |
|
33 |
||
34 |
val _ = Isabelle_Process.protocol_command "print_operations" (fn [] => report ()); |
|
35 |
||
36 |
val _ = Session.protocol_handler "isabelle.Print_Operation$Handler"; |
|
37 |
||
38 |
in |
|
39 |
||
40 |
fun register name description pr = |
|
41 |
(Synchronized.change print_operations (fn tab => |
|
56867 | 42 |
(if not (AList.defined (op =) tab name) then () |
56864 | 43 |
else warning ("Redefining print operation: " ^ quote name); |
56867 | 44 |
AList.update (op =) (name, (description, pr)) tab)); |
56864 | 45 |
report ()); |
46 |
||
47 |
val _ = |
|
48 |
Query_Operation.register "print_operation" (fn {state, args, output_result} => |
|
49 |
let |
|
50 |
val [name] = args; |
|
51 |
val pr = |
|
56867 | 52 |
(case AList.lookup (op =) (Synchronized.value print_operations) name of |
56864 | 53 |
SOME (_, pr) => pr |
54 |
| NONE => error ("Unknown print operation: " ^ quote name)); |
|
55 |
val result = pr state handle Toplevel.UNDEF => error "Unknown context"; |
|
56 |
in output_result result end); |
|
57 |
||
58 |
end; |
|
59 |
||
60 |
||
61 |
(* common print operations *) |
|
62 |
||
63 |
val _ = |
|
56893 | 64 |
register "context" "context of local theory target" |
65 |
(Pretty.string_of o Pretty.chunks o Toplevel.pretty_context); |
|
56867 | 66 |
|
67 |
val _ = |
|
68 |
register "cases" "cases of proof context" |
|
69 |
(Pretty.string_of o Pretty.chunks o Proof_Context.pretty_cases o Toplevel.context_of); |
|
70 |
||
71 |
val _ = |
|
56868
b5fb264d53ba
clarified print operations for "terms" and "theorems";
wenzelm
parents:
56867
diff
changeset
|
72 |
register "terms" "term bindings of proof context" |
57415
e721124f1b1e
command 'print_term_bindings' supersedes 'print_binds';
wenzelm
parents:
56893
diff
changeset
|
73 |
(Pretty.string_of o Pretty.chunks o Proof_Context.pretty_term_bindings o Toplevel.context_of); |
56867 | 74 |
|
75 |
val _ = |
|
56868
b5fb264d53ba
clarified print operations for "terms" and "theorems";
wenzelm
parents:
56867
diff
changeset
|
76 |
register "theorems" "theorems of local theory or proof context" |
b5fb264d53ba
clarified print operations for "terms" and "theorems";
wenzelm
parents:
56867
diff
changeset
|
77 |
(Pretty.string_of o Isar_Cmd.pretty_theorems false); |
56864 | 78 |
|
56867 | 79 |
val _ = |
80 |
register "state" "proof state" |
|
56887
1ca814da47ae
clarified print_state, which goes back to TTY loop before Proof General, and before separate print_context;
wenzelm
parents:
56868
diff
changeset
|
81 |
(Pretty.string_of o Pretty.chunks o Toplevel.pretty_state); |
56867 | 82 |
|
56864 | 83 |
end; |
84 |