| author | blanchet | 
| Mon, 04 Apr 2016 09:45:04 +0200 | |
| changeset 62842 | db9f95ca2a8f | 
| parent 61223 | dfccf6c06201 | 
| child 64677 | 8dc24130e8fe | 
| 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 | |
| 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: 
57605diff
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: 
57605diff
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: 
57605diff
changeset | 51 | val _ = Toplevel.context_of state handle Toplevel.UNDEF => error "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 | fun err s = Pretty.mark_str (Markup.bad, s); | 
| 
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 | 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: 
57605diff
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: 
57605diff
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: 
57605diff
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: 
57415diff
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: 
56867diff
changeset | 72 | register "terms" "term bindings of proof context" | 
| 57604 
30885e25c6de
support multiple selected print operations instead of slightly odd "menu";
 wenzelm parents: 
57415diff
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: 
56867diff
changeset | 76 | register "theorems" "theorems of local theory or proof context" | 
| 57605 | 77 | (Isar_Cmd.pretty_theorems false); | 
| 56864 | 78 | |
| 79 | end; |