| author | traytel | 
| Wed, 06 Nov 2019 21:23:43 +0100 | |
| changeset 71065 | 98ac9a4323a2 | 
| parent 70991 | f9f7c34b7dd4 | 
| child 72156 | 065dcd80293e | 
| 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: 
57415diff
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: 
57415diff
changeset | 22 | ([]: (string * (string * (Toplevel.state -> Pretty.T list))) list); | 
| 56864 | 23 | |
| 24 | fun report () = | |
| 25 | Output.try_protocol_message Markup.print_operations | |
| 70991 
f9f7c34b7dd4
more scalable protocol_message: use XML.body directly (Output.output hook is not required);
 wenzelm parents: 
64677diff
changeset | 26 | (Synchronized.value print_operations | 
| 
f9f7c34b7dd4
more scalable protocol_message: use XML.body directly (Output.output hook is not required);
 wenzelm parents: 
64677diff
changeset | 27 | |> map (fn (x, (y, _)) => (x, y)) |> rev | 
| 
f9f7c34b7dd4
more scalable protocol_message: use XML.body directly (Output.output hook is not required);
 wenzelm parents: 
64677diff
changeset | 28 | |> let open XML.Encode in list (pair string string) end); | 
| 56864 | 29 | |
| 30 | val _ = Isabelle_Process.protocol_command "print_operations" (fn [] => report ()); | |
| 31 | ||
| 32 | val _ = Session.protocol_handler "isabelle.Print_Operation$Handler"; | |
| 33 | ||
| 34 | in | |
| 35 | ||
| 36 | fun register name description pr = | |
| 37 | (Synchronized.change print_operations (fn tab => | |
| 56867 | 38 | (if not (AList.defined (op =) tab name) then () | 
| 56864 | 39 |     else warning ("Redefining print operation: " ^ quote name);
 | 
| 56867 | 40 | AList.update (op =) (name, (description, pr)) tab)); | 
| 56864 | 41 | report ()); | 
| 42 | ||
| 43 | 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: 
57605diff
changeset | 44 |   Query_Operation.register {name = "print_operation", pri = Task_Queue.urgent_pri}
 | 
| 61223 | 45 |     (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: 
57605diff
changeset | 46 | 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: 
57605diff
changeset | 47 | 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: 
61223diff
changeset | 48 | 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: 
57605diff
changeset | 49 | 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: 
57605diff
changeset | 50 | (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: 
57605diff
changeset | 51 | 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: 
57605diff
changeset | 52 |           | NONE => [err ("Unknown print operation: " ^ quote name)]);
 | 
| 61223 | 53 | in writeln_result (Pretty.string_of (Pretty.chunks (maps print args))) end); | 
| 56864 | 54 | |
| 55 | end; | |
| 56 | ||
| 57 | ||
| 58 | (* common print operations *) | |
| 59 | ||
| 60 | val _ = | |
| 57604 
30885e25c6de
support multiple selected print operations instead of slightly odd "menu";
 wenzelm parents: 
57415diff
changeset | 61 | register "context" "context of local theory target" Toplevel.pretty_context; | 
| 56867 | 62 | |
| 63 | val _ = | |
| 57605 | 64 | register "cases" "cases of proof context" | 
| 65 | (Proof_Context.pretty_cases o Toplevel.context_of); | |
| 56867 | 66 | |
| 67 | val _ = | |
| 56868 
b5fb264d53ba
clarified print operations for "terms" and "theorems";
 wenzelm parents: 
56867diff
changeset | 68 | register "terms" "term bindings of proof context" | 
| 57604 
30885e25c6de
support multiple selected print operations instead of slightly odd "menu";
 wenzelm parents: 
57415diff
changeset | 69 | (Proof_Context.pretty_term_bindings o Toplevel.context_of); | 
| 56867 | 70 | |
| 71 | val _ = | |
| 56868 
b5fb264d53ba
clarified print operations for "terms" and "theorems";
 wenzelm parents: 
56867diff
changeset | 72 | register "theorems" "theorems of local theory or proof context" | 
| 57605 | 73 | (Isar_Cmd.pretty_theorems false); | 
| 56864 | 74 | |
| 75 | end; |