src/Pure/Tools/print_operation.ML
author wenzelm
Thu, 21 Dec 2023 21:03:02 +0100
changeset 79329 992c494bda25
parent 76403 fb9c567a67cd
permissions -rw-r--r--
proper thm_name for stored zproof;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
56864
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/Tools/print_operation.ML
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
     3
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
     4
Print operations as asynchronous query.
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
     5
*)
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
     6
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
     7
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
     8
signature PRINT_OPERATION =
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
     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
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    11
end;
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    12
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    13
structure Print_Operation: PRINT_OPERATION =
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    14
struct
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    15
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    16
(* maintain print operations *)
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    17
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    18
local
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    19
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    20
val print_operations =
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    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
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    23
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    24
fun report () =
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    25
  Output.try_protocol_message Markup.print_operations
73559
22b5ecb53dd9 more uniform use of Byte_Message;
wenzelm
parents: 73225
diff changeset
    26
    [Synchronized.value print_operations
70991
f9f7c34b7dd4 more scalable protocol_message: use XML.body directly (Output.output hook is not required);
wenzelm
parents: 64677
diff changeset
    27
      |> map (fn (x, (y, _)) => (x, y)) |> rev
73559
22b5ecb53dd9 more uniform use of Byte_Message;
wenzelm
parents: 73225
diff changeset
    28
      |> let open XML.Encode in list (pair string string) end];
56864
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    29
73225
3ab0cedaccad clarified modules: allow early definition of protocol commands;
wenzelm
parents: 72156
diff changeset
    30
val _ = Protocol_Command.define "print_operations" (fn [] => report ());
56864
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    31
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    32
in
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    33
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    34
fun register name description pr =
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    35
 (Synchronized.change print_operations (fn tab =>
56867
224109105008 more print operations;
wenzelm
parents: 56864
diff changeset
    36
   (if not (AList.defined (op =) tab name) then ()
56864
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    37
    else warning ("Redefining print operation: " ^ quote name);
56867
224109105008 more print operations;
wenzelm
parents: 56864
diff changeset
    38
    AList.update (op =) (name, (description, pr)) tab));
56864
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    39
  report ());
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    40
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    41
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
    42
  Query_Operation.register {name = "print_operation", pri = Task_Queue.urgent_pri}
61223
dfccf6c06201 clarified markup;
wenzelm
parents: 61212
diff changeset
    43
    (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
    44
      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
    45
        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
    46
        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
    47
        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
    48
          (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
    49
            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
    50
          | NONE => [err ("Unknown print operation: " ^ quote name)]);
61223
dfccf6c06201 clarified markup;
wenzelm
parents: 61212
diff changeset
    51
      in writeln_result (Pretty.string_of (Pretty.chunks (maps print args))) end);
56864
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    52
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    53
end;
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    54
76403
fb9c567a67cd clarified modules;
wenzelm
parents: 73559
diff changeset
    55
end;
fb9c567a67cd clarified modules;
wenzelm
parents: 73559
diff changeset
    56
56864
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    57
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    58
(* common print operations *)
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    59
0446c7ac2e32 support print operations as asynchronous query;
wenzelm
parents:
diff changeset
    60
val _ =
76403
fb9c567a67cd clarified modules;
wenzelm
parents: 73559
diff changeset
    61
  Print_Operation.register "context" "context of local theory target"
fb9c567a67cd clarified modules;
wenzelm
parents: 73559
diff changeset
    62
    Toplevel.pretty_context;
56867
224109105008 more print operations;
wenzelm
parents: 56864
diff changeset
    63
224109105008 more print operations;
wenzelm
parents: 56864
diff changeset
    64
val _ =
76403
fb9c567a67cd clarified modules;
wenzelm
parents: 73559
diff changeset
    65
  Print_Operation.register "cases" "cases of proof context"
57605
8e0a7eaffe47 tuned messages;
wenzelm
parents: 57604
diff changeset
    66
    (Proof_Context.pretty_cases o Toplevel.context_of);
56867
224109105008 more print operations;
wenzelm
parents: 56864
diff changeset
    67
224109105008 more print operations;
wenzelm
parents: 56864
diff changeset
    68
val _ =
76403
fb9c567a67cd clarified modules;
wenzelm
parents: 73559
diff changeset
    69
  Print_Operation.register "terms" "term bindings of proof context"
57604
30885e25c6de support multiple selected print operations instead of slightly odd "menu";
wenzelm
parents: 57415
diff changeset
    70
    (Proof_Context.pretty_term_bindings o Toplevel.context_of);
56867
224109105008 more print operations;
wenzelm
parents: 56864
diff changeset
    71
224109105008 more print operations;
wenzelm
parents: 56864
diff changeset
    72
val _ =
76403
fb9c567a67cd clarified modules;
wenzelm
parents: 73559
diff changeset
    73
  Print_Operation.register "theorems" "theorems of local theory or proof context"
57605
8e0a7eaffe47 tuned messages;
wenzelm
parents: 57604
diff changeset
    74
    (Isar_Cmd.pretty_theorems false);