author | wenzelm |
Thu, 10 Oct 2019 14:55:26 +0200 | |
changeset 70823 | c6f2a73987cd |
parent 64677 | 8dc24130e8fe |
child 70991 | f9f7c34b7dd4 |
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 |
|
57604
30885e25c6de
support multiple selected print operations instead of slightly odd "menu";
wenzelm
parents:
57415
diff
changeset
|
10 |
val register: string -> string -> (Toplevel.state -> Pretty.T list) -> unit |
56864 | 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" |
|
57604
30885e25c6de
support multiple selected print operations instead of slightly odd "menu";
wenzelm
parents:
57415
diff
changeset
|
22 |
([]: (string * (string * (Toplevel.state -> Pretty.T list))) 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 _ = |
|
60610
f52b4b0c10c4
improved scheduling for urgent tasks, using farm of replacement threads (may lead to factor 2 overloading, but CPUs are usually hyperthreaded);
wenzelm
parents:
57605
diff
changeset
|
48 |
Query_Operation.register {name = "print_operation", pri = Task_Queue.urgent_pri} |
61223 | 49 |
(fn {state, args, writeln_result, ...} => |
60610
f52b4b0c10c4
improved scheduling for urgent tasks, using farm of replacement threads (may lead to factor 2 overloading, but CPUs are usually hyperthreaded);
wenzelm
parents:
57605
diff
changeset
|
50 |
let |
f52b4b0c10c4
improved scheduling for urgent tasks, using farm of replacement threads (may lead to factor 2 overloading, but CPUs are usually hyperthreaded);
wenzelm
parents:
57605
diff
changeset
|
51 |
val _ = Toplevel.context_of state handle Toplevel.UNDEF => error "Unknown context"; |
64677
8dc24130e8fe
more uniform treatment of "bad" like other messages (with serial number);
wenzelm
parents:
61223
diff
changeset
|
52 |
fun err s = Pretty.mark_str (Markup.bad (), s); |
60610
f52b4b0c10c4
improved scheduling for urgent tasks, using farm of replacement threads (may lead to factor 2 overloading, but CPUs are usually hyperthreaded);
wenzelm
parents:
57605
diff
changeset
|
53 |
fun print name = |
f52b4b0c10c4
improved scheduling for urgent tasks, using farm of replacement threads (may lead to factor 2 overloading, but CPUs are usually hyperthreaded);
wenzelm
parents:
57605
diff
changeset
|
54 |
(case AList.lookup (op =) (Synchronized.value print_operations) name of |
f52b4b0c10c4
improved scheduling for urgent tasks, using farm of replacement threads (may lead to factor 2 overloading, but CPUs are usually hyperthreaded);
wenzelm
parents:
57605
diff
changeset
|
55 |
SOME (_, pr) => (pr state handle Toplevel.UNDEF => [err "Unknown context"]) |
f52b4b0c10c4
improved scheduling for urgent tasks, using farm of replacement threads (may lead to factor 2 overloading, but CPUs are usually hyperthreaded);
wenzelm
parents:
57605
diff
changeset
|
56 |
| NONE => [err ("Unknown print operation: " ^ quote name)]); |
61223 | 57 |
in writeln_result (Pretty.string_of (Pretty.chunks (maps print args))) end); |
56864 | 58 |
|
59 |
end; |
|
60 |
||
61 |
||
62 |
(* common print operations *) |
|
63 |
||
64 |
val _ = |
|
57604
30885e25c6de
support multiple selected print operations instead of slightly odd "menu";
wenzelm
parents:
57415
diff
changeset
|
65 |
register "context" "context of local theory target" Toplevel.pretty_context; |
56867 | 66 |
|
67 |
val _ = |
|
57605 | 68 |
register "cases" "cases of proof context" |
69 |
(Proof_Context.pretty_cases o Toplevel.context_of); |
|
56867 | 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" |
57604
30885e25c6de
support multiple selected print operations instead of slightly odd "menu";
wenzelm
parents:
57415
diff
changeset
|
73 |
(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" |
57605 | 77 |
(Isar_Cmd.pretty_theorems false); |
56864 | 78 |
|
79 |
end; |