src/Pure/PIDE/command.ML
author paulson <lp15@cam.ac.uk>
Fri, 08 Aug 2025 16:46:03 +0100
changeset 82969 dedd9d13c79c
parent 82906 a27841dcd7df
permissions -rw-r--r--
Generalised a theorem about Lebesgue integration
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
47336
bed4b2738d8a separate module for prover command execution;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/PIDE/command.ML
bed4b2738d8a separate module for prover command execution;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
bed4b2738d8a separate module for prover command execution;
wenzelm
parents:
diff changeset
     3
52534
341ae9cd4743 tuned signature;
wenzelm
parents: 52533
diff changeset
     4
Prover command execution: read -- eval -- print.
47336
bed4b2738d8a separate module for prover command execution;
wenzelm
parents:
diff changeset
     5
*)
bed4b2738d8a separate module for prover command execution;
wenzelm
parents:
diff changeset
     6
bed4b2738d8a separate module for prover command execution;
wenzelm
parents:
diff changeset
     7
signature COMMAND =
bed4b2738d8a separate module for prover command execution;
wenzelm
parents:
diff changeset
     8
sig
72747
5f9d66155081 clarified theory keywords: loaded_files are determined statically in Scala, but ML needs to do it semantically;
wenzelm
parents: 71675
diff changeset
     9
  type blob = {file_node: string, src_path: Path.T, content: (SHA1.digest * string list) option}
58928
23d0ffd48006 plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents: 58923
diff changeset
    10
  val read_thy: Toplevel.state -> theory
58934
385a4cc7426f prefer externally provided keywords -- Command.read_thy may degenerate to bootstrap_thy in case of errors;
wenzelm
parents: 58928
diff changeset
    11
  val read: Keyword.keywords -> theory -> Path.T-> (unit -> theory) ->
72747
5f9d66155081 clarified theory keywords: loaded_files are determined statically in Scala, but ML needs to do it semantically;
wenzelm
parents: 71675
diff changeset
    12
    blob Exn.result list * int -> Token.T list -> Toplevel.transition
73044
e7855739409e tuned signature;
wenzelm
parents: 72950
diff changeset
    13
  val read_span: Keyword.keywords -> Toplevel.state -> Path.T -> (unit -> theory) ->
e7855739409e tuned signature;
wenzelm
parents: 72950
diff changeset
    14
    Command_Span.span -> Toplevel.transition
52600
75afb82daf5c more abstract types;
wenzelm
parents: 52598
diff changeset
    15
  type eval
68184
6c693b2700b3 support for dynamic document output while editing;
wenzelm
parents: 68130
diff changeset
    16
  val eval_command_id: eval -> Document_ID.command
66379
6392766f3c25 maintain "consolidated" status of theory nodes, which means all evals are finished (but not necessarily prints nor imports);
wenzelm
parents: 66167
diff changeset
    17
  val eval_exec_id: eval -> Document_ID.exec
52607
33a133d50616 clarified execution: maintain running execs only, check "stable" separately via memo (again);
wenzelm
parents: 52606
diff changeset
    18
  val eval_eq: eval * eval -> bool
52784
4ba2e8b9972f de-assign execs that were not registered as running yet -- observe change of perspective more thoroughly;
wenzelm
parents: 52775
diff changeset
    19
  val eval_running: eval -> bool
52772
7764c90680f0 clarified conditions for node traversal;
wenzelm
parents: 52762
diff changeset
    20
  val eval_finished: eval -> bool
68184
6c693b2700b3 support for dynamic document output while editing;
wenzelm
parents: 68130
diff changeset
    21
  val eval_result_command: eval -> Toplevel.transition
52536
3a35ce87a55c tuned signature;
wenzelm
parents: 52535
diff changeset
    22
  val eval_result_state: eval -> Toplevel.state
58934
385a4cc7426f prefer externally provided keywords -- Command.read_thy may degenerate to bootstrap_thy in case of errors;
wenzelm
parents: 58928
diff changeset
    23
  val eval: Keyword.keywords -> Path.T -> (unit -> theory) ->
72747
5f9d66155081 clarified theory keywords: loaded_files are determined statically in Scala, but ML needs to do it semantically;
wenzelm
parents: 71675
diff changeset
    24
    blob Exn.result list * int -> Document_ID.command -> Token.T list -> eval -> eval
52600
75afb82daf5c more abstract types;
wenzelm
parents: 52598
diff changeset
    25
  type print
68344
3bb44c25ce8b clarified priority;
wenzelm
parents: 68334
diff changeset
    26
  type print_fn = Toplevel.transition -> Toplevel.state -> unit
3bb44c25ce8b clarified priority;
wenzelm
parents: 68334
diff changeset
    27
  val print0: {pri: int, print_fn: print_fn} -> eval -> print
76430
bb96846e27f8 tuned signature;
wenzelm
parents: 76424
diff changeset
    28
  val print: Keyword.keywords -> bool -> (string * string list) list -> string ->
52850
9fff9f78240a support print functions with explicit arguments, as provided by overlays;
wenzelm
parents: 52785
diff changeset
    29
    eval -> print list -> print list option
68366
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
    30
  val parallel_print: print -> bool
52953
2c927b7501c5 explicit "strict" flag for print functions (flipped internal meaning);
wenzelm
parents: 52853
diff changeset
    31
  type print_function =
58923
cb9b69cca999 more explicit Keyword.keywords;
wenzelm
parents: 58862
diff changeset
    32
    {keywords: Keyword.keywords, command_name: string, args: string list, exec_id: Document_ID.exec} ->
52953
2c927b7501c5 explicit "strict" flag for print functions (flipped internal meaning);
wenzelm
parents: 52853
diff changeset
    33
      {delay: Time.time option, pri: int, persistent: bool, strict: bool, print_fn: print_fn} option
2c927b7501c5 explicit "strict" flag for print functions (flipped internal meaning);
wenzelm
parents: 52853
diff changeset
    34
  val print_function: string -> print_function -> unit
52571
344527354323 allow to remove print functions;
wenzelm
parents: 52570
diff changeset
    35
  val no_print_function: string -> unit
52600
75afb82daf5c more abstract types;
wenzelm
parents: 52598
diff changeset
    36
  type exec = eval * print list
62895
54c2abe7e9a4 treat ROOT.ML as theory with header "theory ML_Root imports ML_Bootstrap begin";
wenzelm
parents: 62826
diff changeset
    37
  val init_exec: theory option -> exec
52600
75afb82daf5c more abstract types;
wenzelm
parents: 52598
diff changeset
    38
  val no_exec: exec
75afb82daf5c more abstract types;
wenzelm
parents: 52598
diff changeset
    39
  val exec_ids: exec option -> Document_ID.exec list
52606
0d68d108d7e0 tuned signature;
wenzelm
parents: 52605
diff changeset
    40
  val exec: Document_ID.execution -> exec -> unit
68366
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
    41
  val exec_parallel_prints: Document_ID.execution -> Future.task list -> exec -> exec option
47336
bed4b2738d8a separate module for prover command execution;
wenzelm
parents:
diff changeset
    42
end;
bed4b2738d8a separate module for prover command execution;
wenzelm
parents:
diff changeset
    43
bed4b2738d8a separate module for prover command execution;
wenzelm
parents:
diff changeset
    44
structure Command: COMMAND =
bed4b2738d8a separate module for prover command execution;
wenzelm
parents:
diff changeset
    45
struct
bed4b2738d8a separate module for prover command execution;
wenzelm
parents:
diff changeset
    46
52536
3a35ce87a55c tuned signature;
wenzelm
parents: 52535
diff changeset
    47
(** main phases of execution **)
3a35ce87a55c tuned signature;
wenzelm
parents: 52535
diff changeset
    48
59466
6fab87db556c ensure that running into older execution is interruptible (see also b91dc7ab3464);
wenzelm
parents: 59348
diff changeset
    49
fun task_context group f =
6fab87db556c ensure that running into older execution is interruptible (see also b91dc7ab3464);
wenzelm
parents: 59348
diff changeset
    50
  f
6fab87db556c ensure that running into older execution is interruptible (see also b91dc7ab3464);
wenzelm
parents: 59348
diff changeset
    51
  |> Future.interruptible_task
6fab87db556c ensure that running into older execution is interruptible (see also b91dc7ab3464);
wenzelm
parents: 59348
diff changeset
    52
  |> Future.task_context "Command.run_process" group;
6fab87db556c ensure that running into older execution is interruptible (see also b91dc7ab3464);
wenzelm
parents: 59348
diff changeset
    53
6fab87db556c ensure that running into older execution is interruptible (see also b91dc7ab3464);
wenzelm
parents: 59348
diff changeset
    54
52510
a4a102237ded tuned signature;
wenzelm
parents: 52509
diff changeset
    55
(* read *)
52509
2193d2c7f586 tuned signature;
wenzelm
parents: 51605
diff changeset
    56
72747
5f9d66155081 clarified theory keywords: loaded_files are determined statically in Scala, but ML needs to do it semantically;
wenzelm
parents: 71675
diff changeset
    57
type blob = {file_node: string, src_path: Path.T, content: (SHA1.digest * string list) option};
54519
5fed81762406 maintain blobs within document state: digest + text in ML, digest-only in Scala;
wenzelm
parents: 53976
diff changeset
    58
55788
67699e08e969 store blobs / inlined files as separate text lines: smaller values are more healthy for the Poly/ML RTS and allow implicit sharing;
wenzelm
parents: 55709
diff changeset
    59
local
67699e08e969 store blobs / inlined files as separate text lines: smaller values are more healthy for the Poly/ML RTS and allow implicit sharing;
wenzelm
parents: 55709
diff changeset
    60
56447
1e77ed11f2f7 separate file_node vs. file_path, e.g. relevant on Windows for hyperlink to the latter;
wenzelm
parents: 56333
diff changeset
    61
fun blob_file src_path lines digest file_node =
55788
67699e08e969 store blobs / inlined files as separate text lines: smaller values are more healthy for the Poly/ML RTS and allow implicit sharing;
wenzelm
parents: 55709
diff changeset
    62
  let
67699e08e969 store blobs / inlined files as separate text lines: smaller values are more healthy for the Poly/ML RTS and allow implicit sharing;
wenzelm
parents: 55709
diff changeset
    63
    val file_pos =
56447
1e77ed11f2f7 separate file_node vs. file_path, e.g. relevant on Windows for hyperlink to the latter;
wenzelm
parents: 56333
diff changeset
    64
      Position.file file_node |>
74166
ff3dbb2be924 tuned signature;
wenzelm
parents: 73761
diff changeset
    65
      (case Position.id_of (Position.thread_data ()) of
55788
67699e08e969 store blobs / inlined files as separate text lines: smaller values are more healthy for the Poly/ML RTS and allow implicit sharing;
wenzelm
parents: 55709
diff changeset
    66
        NONE => I
67699e08e969 store blobs / inlined files as separate text lines: smaller values are more healthy for the Poly/ML RTS and allow implicit sharing;
wenzelm
parents: 55709
diff changeset
    67
      | SOME exec_id => Position.put_id exec_id);
67699e08e969 store blobs / inlined files as separate text lines: smaller values are more healthy for the Poly/ML RTS and allow implicit sharing;
wenzelm
parents: 55709
diff changeset
    68
  in {src_path = src_path, lines = lines, digest = digest, pos = file_pos} end
54526
92961f196d9e load files that are not provided by PIDE blobs;
wenzelm
parents: 54523
diff changeset
    69
72747
5f9d66155081 clarified theory keywords: loaded_files are determined statically in Scala, but ML needs to do it semantically;
wenzelm
parents: 71675
diff changeset
    70
fun resolve_files master_dir (blobs, blobs_index) toks =
57905
c0c5652e796e separate module Command_Span: mostly syntactic representation;
wenzelm
parents: 57844
diff changeset
    71
  (case Outer_Syntax.parse_spans toks of
72841
fd8d82c4433b more accurate markup (refining 1c59b555ac4a);
wenzelm
parents: 72747
diff changeset
    72
    [Command_Span.Span (Command_Span.Command_Span _, _)] =>
59689
7968c57ea240 simplified Command.resolve_files in ML, using blobs_index from Scala;
wenzelm
parents: 59685
diff changeset
    73
      (case try (nth toks) blobs_index of
7968c57ea240 simplified Command.resolve_files in ML, using blobs_index from Scala;
wenzelm
parents: 59685
diff changeset
    74
        SOME tok =>
7968c57ea240 simplified Command.resolve_files in ML, using blobs_index from Scala;
wenzelm
parents: 59685
diff changeset
    75
          let
72841
fd8d82c4433b more accurate markup (refining 1c59b555ac4a);
wenzelm
parents: 72747
diff changeset
    76
            val source = Token.input_of tok;
fd8d82c4433b more accurate markup (refining 1c59b555ac4a);
wenzelm
parents: 72747
diff changeset
    77
            val pos = Input.pos_of source;
fd8d82c4433b more accurate markup (refining 1c59b555ac4a);
wenzelm
parents: 72747
diff changeset
    78
            val delimited = Input.is_delimited source;
fd8d82c4433b more accurate markup (refining 1c59b555ac4a);
wenzelm
parents: 72747
diff changeset
    79
76806
797621be9317 more uniform report of Markup.language_path;
wenzelm
parents: 76803
diff changeset
    80
            fun make_file (Exn.Res {file_node, src_path, content}) =
797621be9317 more uniform report of Markup.language_path;
wenzelm
parents: 76803
diff changeset
    81
                  let val _ = Position.report pos (Markup.language_path delimited) in
797621be9317 more uniform report of Markup.language_path;
wenzelm
parents: 76803
diff changeset
    82
                    case content of
797621be9317 more uniform report of Markup.language_path;
wenzelm
parents: 76803
diff changeset
    83
                      NONE =>
78705
fde0b195cb7d clarified signature: avoid association with potentially dangerous Exn.capture;
wenzelm
parents: 78681
diff changeset
    84
                        Exn.result (fn () =>
76806
797621be9317 more uniform report of Markup.language_path;
wenzelm
parents: 76803
diff changeset
    85
                          Resources.read_file_node file_node master_dir (src_path, pos)) ()
797621be9317 more uniform report of Markup.language_path;
wenzelm
parents: 76803
diff changeset
    86
                    | SOME (digest, lines) => Exn.Res (blob_file src_path lines digest file_node)
797621be9317 more uniform report of Markup.language_path;
wenzelm
parents: 76803
diff changeset
    87
                  end
72747
5f9d66155081 clarified theory keywords: loaded_files are determined statically in Scala, but ML needs to do it semantically;
wenzelm
parents: 71675
diff changeset
    88
              | make_file (Exn.Exn e) = Exn.Exn e;
5f9d66155081 clarified theory keywords: loaded_files are determined statically in Scala, but ML needs to do it semantically;
wenzelm
parents: 71675
diff changeset
    89
            val files = map make_file blobs;
59689
7968c57ea240 simplified Command.resolve_files in ML, using blobs_index from Scala;
wenzelm
parents: 59685
diff changeset
    90
          in
7968c57ea240 simplified Command.resolve_files in ML, using blobs_index from Scala;
wenzelm
parents: 59685
diff changeset
    91
            toks |> map_index (fn (i, tok) =>
7968c57ea240 simplified Command.resolve_files in ML, using blobs_index from Scala;
wenzelm
parents: 59685
diff changeset
    92
              if i = blobs_index then Token.put_files files tok else tok)
7968c57ea240 simplified Command.resolve_files in ML, using blobs_index from Scala;
wenzelm
parents: 59685
diff changeset
    93
          end
7968c57ea240 simplified Command.resolve_files in ML, using blobs_index from Scala;
wenzelm
parents: 59685
diff changeset
    94
      | NONE => toks)
54519
5fed81762406 maintain blobs within document state: digest + text in ML, digest-only in Scala;
wenzelm
parents: 53976
diff changeset
    95
  | _ => toks);
5fed81762406 maintain blobs within document state: digest + text in ML, digest-only in Scala;
wenzelm
parents: 53976
diff changeset
    96
61379
c57820ceead3 more direct HTML presentation, without print mode;
wenzelm
parents: 61213
diff changeset
    97
fun reports_of_token keywords tok =
c57820ceead3 more direct HTML presentation, without print mode;
wenzelm
parents: 61213
diff changeset
    98
  let
c57820ceead3 more direct HTML presentation, without print mode;
wenzelm
parents: 61213
diff changeset
    99
    val malformed_symbols =
c57820ceead3 more direct HTML presentation, without print mode;
wenzelm
parents: 61213
diff changeset
   100
      Input.source_explode (Token.input_of tok)
c57820ceead3 more direct HTML presentation, without print mode;
wenzelm
parents: 61213
diff changeset
   101
      |> map_filter (fn (sym, pos) =>
c57820ceead3 more direct HTML presentation, without print mode;
wenzelm
parents: 61213
diff changeset
   102
          if Symbol.is_malformed sym
64677
8dc24130e8fe more uniform treatment of "bad" like other messages (with serial number);
wenzelm
parents: 63475
diff changeset
   103
          then SOME ((pos, Markup.bad ()), "Malformed symbolic character") else NONE);
61379
c57820ceead3 more direct HTML presentation, without print mode;
wenzelm
parents: 61213
diff changeset
   104
    val is_malformed = Token.is_error tok orelse not (null malformed_symbols);
c57820ceead3 more direct HTML presentation, without print mode;
wenzelm
parents: 61213
diff changeset
   105
    val reports = Token.reports keywords tok @ Token.completion_report tok @ malformed_symbols;
c57820ceead3 more direct HTML presentation, without print mode;
wenzelm
parents: 61213
diff changeset
   106
  in (is_malformed, reports) end;
c57820ceead3 more direct HTML presentation, without print mode;
wenzelm
parents: 61213
diff changeset
   107
55788
67699e08e969 store blobs / inlined files as separate text lines: smaller values are more healthy for the Poly/ML RTS and allow implicit sharing;
wenzelm
parents: 55709
diff changeset
   108
in
67699e08e969 store blobs / inlined files as separate text lines: smaller values are more healthy for the Poly/ML RTS and allow implicit sharing;
wenzelm
parents: 55709
diff changeset
   109
60095
35f626b11422 more explicit bootstrap_thy;
wenzelm
parents: 60076
diff changeset
   110
fun read_thy st = Toplevel.theory_of st
35f626b11422 more explicit bootstrap_thy;
wenzelm
parents: 60076
diff changeset
   111
  handle Toplevel.UNDEF => Pure_Syn.bootstrap_thy;
58928
23d0ffd48006 plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents: 58923
diff changeset
   112
59689
7968c57ea240 simplified Command.resolve_files in ML, using blobs_index from Scala;
wenzelm
parents: 59685
diff changeset
   113
fun read keywords thy master_dir init blobs_info span =
52510
a4a102237ded tuned signature;
wenzelm
parents: 52509
diff changeset
   114
  let
58928
23d0ffd48006 plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents: 58923
diff changeset
   115
    val command_reports = Outer_Syntax.command_reports thy;
61379
c57820ceead3 more direct HTML presentation, without print mode;
wenzelm
parents: 61213
diff changeset
   116
    val token_reports = map (reports_of_token keywords) span;
c57820ceead3 more direct HTML presentation, without print mode;
wenzelm
parents: 61213
diff changeset
   117
    val _ = Position.reports_text (maps #2 token_reports @ maps command_reports span);
69506
7d59af98af29 {* verbatim *} is explicit legacy feature;
wenzelm
parents: 68931
diff changeset
   118
74673
eae5fa0055bd more PIDE markup;
wenzelm
parents: 74166
diff changeset
   119
    val core_range = Token.core_range_of span;
eae5fa0055bd more PIDE markup;
wenzelm
parents: 74166
diff changeset
   120
    val tr =
eae5fa0055bd more PIDE markup;
wenzelm
parents: 74166
diff changeset
   121
      if exists #1 token_reports
eae5fa0055bd more PIDE markup;
wenzelm
parents: 74166
diff changeset
   122
      then Toplevel.malformed (#1 core_range) "Malformed command syntax"
eae5fa0055bd more PIDE markup;
wenzelm
parents: 74166
diff changeset
   123
      else Outer_Syntax.parse_span thy init (resolve_files master_dir blobs_info span);
eae5fa0055bd more PIDE markup;
wenzelm
parents: 74166
diff changeset
   124
    val _ =
eae5fa0055bd more PIDE markup;
wenzelm
parents: 74166
diff changeset
   125
      if Toplevel.is_ignored tr orelse Toplevel.is_malformed tr then ()
78279
dab089b25eb6 more markup for command_span: this allows to reconstruct Thy_Element structure without knowing the outer syntax;
wenzelm
parents: 76806
diff changeset
   126
      else
dab089b25eb6 more markup for command_span: this allows to reconstruct Thy_Element structure without knowing the outer syntax;
wenzelm
parents: 76806
diff changeset
   127
        let
dab089b25eb6 more markup for command_span: this allows to reconstruct Thy_Element structure without knowing the outer syntax;
wenzelm
parents: 76806
diff changeset
   128
          val name = Toplevel.name_of tr;
dab089b25eb6 more markup for command_span: this allows to reconstruct Thy_Element structure without knowing the outer syntax;
wenzelm
parents: 76806
diff changeset
   129
          val kind = the_default "" (Keyword.command_kind (Thy_Header.get_keywords thy) name);
82906
a27841dcd7df more direct support for "command_span" markup property "is_begin";
wenzelm
parents: 82589
diff changeset
   130
          val is_begin = exists Token.is_begin span;
a27841dcd7df more direct support for "command_span" markup property "is_begin";
wenzelm
parents: 82589
diff changeset
   131
          val markup = Markup.command_span {name = name, kind = kind, is_begin = is_begin};
78279
dab089b25eb6 more markup for command_span: this allows to reconstruct Thy_Element structure without knowing the outer syntax;
wenzelm
parents: 76806
diff changeset
   132
        in Position.report (#1 core_range) markup end;
74673
eae5fa0055bd more PIDE markup;
wenzelm
parents: 74166
diff changeset
   133
  in tr end;
52509
2193d2c7f586 tuned signature;
wenzelm
parents: 51605
diff changeset
   134
55788
67699e08e969 store blobs / inlined files as separate text lines: smaller values are more healthy for the Poly/ML RTS and allow implicit sharing;
wenzelm
parents: 55709
diff changeset
   135
end;
67699e08e969 store blobs / inlined files as separate text lines: smaller values are more healthy for the Poly/ML RTS and allow implicit sharing;
wenzelm
parents: 55709
diff changeset
   136
73044
e7855739409e tuned signature;
wenzelm
parents: 72950
diff changeset
   137
fun read_span keywords st master_dir init =
e7855739409e tuned signature;
wenzelm
parents: 72950
diff changeset
   138
  Command_Span.content #> read keywords (read_thy st) master_dir init ([], ~1);
e7855739409e tuned signature;
wenzelm
parents: 72950
diff changeset
   139
52509
2193d2c7f586 tuned signature;
wenzelm
parents: 51605
diff changeset
   140
2193d2c7f586 tuned signature;
wenzelm
parents: 51605
diff changeset
   141
(* eval *)
47336
bed4b2738d8a separate module for prover command execution;
wenzelm
parents:
diff changeset
   142
59472
513300fa2d09 discontinued special treatment of malformed commands (reverting e46cd0d26481), i.e. errors in outer syntax failure are treated like errors in inner syntax, name space lookup etc.;
wenzelm
parents: 59466
diff changeset
   143
type eval_state = {failed: bool, command: Toplevel.transition, state: Toplevel.state};
62895
54c2abe7e9a4 treat ROOT.ML as theory with header "theory ML_Root imports ML_Bootstrap begin";
wenzelm
parents: 62826
diff changeset
   144
54c2abe7e9a4 treat ROOT.ML as theory with header "theory ML_Root imports ML_Bootstrap begin";
wenzelm
parents: 62826
diff changeset
   145
fun init_eval_state opt_thy =
54c2abe7e9a4 treat ROOT.ML as theory with header "theory ML_Root imports ML_Bootstrap begin";
wenzelm
parents: 62826
diff changeset
   146
 {failed = false,
54c2abe7e9a4 treat ROOT.ML as theory with header "theory ML_Root imports ML_Bootstrap begin";
wenzelm
parents: 62826
diff changeset
   147
  command = Toplevel.empty,
76415
f362975e8ba1 clarified signature;
wenzelm
parents: 76403
diff changeset
   148
  state = Toplevel.make_state opt_thy};
52600
75afb82daf5c more abstract types;
wenzelm
parents: 52598
diff changeset
   149
68184
6c693b2700b3 support for dynamic document output while editing;
wenzelm
parents: 68130
diff changeset
   150
datatype eval =
6c693b2700b3 support for dynamic document output while editing;
wenzelm
parents: 68130
diff changeset
   151
  Eval of
6c693b2700b3 support for dynamic document output while editing;
wenzelm
parents: 68130
diff changeset
   152
    {command_id: Document_ID.command, exec_id: Document_ID.exec, eval_process: eval_state lazy};
6c693b2700b3 support for dynamic document output while editing;
wenzelm
parents: 68130
diff changeset
   153
6c693b2700b3 support for dynamic document output while editing;
wenzelm
parents: 68130
diff changeset
   154
fun eval_command_id (Eval {command_id, ...}) = command_id;
52600
75afb82daf5c more abstract types;
wenzelm
parents: 52598
diff changeset
   155
56291
e79f76a48449 added Execution.print: accumulate print operations for some command execution, which are applied later and print time;
wenzelm
parents: 56265
diff changeset
   156
fun eval_exec_id (Eval {exec_id, ...}) = exec_id;
59058
a78612c67ec0 renamed "pairself" to "apply2", in accordance to @{apply 2};
wenzelm
parents: 58934
diff changeset
   157
val eval_eq = op = o apply2 eval_exec_id;
52607
33a133d50616 clarified execution: maintain running execs only, check "stable" separately via memo (again);
wenzelm
parents: 52606
diff changeset
   158
56291
e79f76a48449 added Execution.print: accumulate print operations for some command execution, which are applied later and print time;
wenzelm
parents: 56265
diff changeset
   159
val eval_running = Execution.is_running_exec o eval_exec_id;
59193
59f1591a11cb eliminated Document.execution frontier (again, see 627fb639a2d9): just run into older execution, potentially stalling worker thread, but without global delay due to long-running tasks (notably sledgehammer);
wenzelm
parents: 59188
diff changeset
   160
fun eval_finished (Eval {eval_process, ...}) = Lazy.is_finished eval_process;
52772
7764c90680f0 clarified conditions for node traversal;
wenzelm
parents: 52762
diff changeset
   161
59466
6fab87db556c ensure that running into older execution is interruptible (see also b91dc7ab3464);
wenzelm
parents: 59348
diff changeset
   162
fun eval_result (Eval {eval_process, ...}) =
68867
a8728e3f9822 more robust eval_result: enforce finished result stemming from previous run_process, fail if that was interrupted (e.g. due to resource problems);
wenzelm
parents: 68858
diff changeset
   163
  Exn.release (Lazy.finished_result eval_process);
59466
6fab87db556c ensure that running into older execution is interruptible (see also b91dc7ab3464);
wenzelm
parents: 59348
diff changeset
   164
68184
6c693b2700b3 support for dynamic document output while editing;
wenzelm
parents: 68130
diff changeset
   165
val eval_result_command = #command o eval_result;
52600
75afb82daf5c more abstract types;
wenzelm
parents: 52598
diff changeset
   166
val eval_result_state = #state o eval_result;
75afb82daf5c more abstract types;
wenzelm
parents: 52598
diff changeset
   167
47336
bed4b2738d8a separate module for prover command execution;
wenzelm
parents:
diff changeset
   168
local
bed4b2738d8a separate module for prover command execution;
wenzelm
parents:
diff changeset
   169
58923
cb9b69cca999 more explicit Keyword.keywords;
wenzelm
parents: 58862
diff changeset
   170
fun reset_state keywords tr st0 = Toplevel.setmp_thread_position tr (fn () =>
56937
d11d11da0d90 smarter recovery from toplevel type error;
wenzelm
parents: 56896
diff changeset
   171
  let
d11d11da0d90 smarter recovery from toplevel type error;
wenzelm
parents: 56896
diff changeset
   172
    val name = Toplevel.name_of tr;
d11d11da0d90 smarter recovery from toplevel type error;
wenzelm
parents: 56896
diff changeset
   173
    val res =
58923
cb9b69cca999 more explicit Keyword.keywords;
wenzelm
parents: 58862
diff changeset
   174
      if Keyword.is_theory_body keywords name then Toplevel.reset_theory st0
cb9b69cca999 more explicit Keyword.keywords;
wenzelm
parents: 58862
diff changeset
   175
      else if Keyword.is_proof keywords name then Toplevel.reset_proof st0
68877
33d78e5e0a00 more robust reset_state: begin/end structure takes precedence over goal/proof structure;
wenzelm
parents: 68874
diff changeset
   176
      else if Keyword.is_theory_end keywords name then
33d78e5e0a00 more robust reset_state: begin/end structure takes precedence over goal/proof structure;
wenzelm
parents: 68874
diff changeset
   177
        (case Toplevel.reset_notepad st0 of
33d78e5e0a00 more robust reset_state: begin/end structure takes precedence over goal/proof structure;
wenzelm
parents: 68874
diff changeset
   178
          NONE => Toplevel.reset_theory st0
33d78e5e0a00 more robust reset_state: begin/end structure takes precedence over goal/proof structure;
wenzelm
parents: 68874
diff changeset
   179
        | some => some)
56937
d11d11da0d90 smarter recovery from toplevel type error;
wenzelm
parents: 56896
diff changeset
   180
      else NONE;
d11d11da0d90 smarter recovery from toplevel type error;
wenzelm
parents: 56896
diff changeset
   181
  in
d11d11da0d90 smarter recovery from toplevel type error;
wenzelm
parents: 56896
diff changeset
   182
    (case res of
d11d11da0d90 smarter recovery from toplevel type error;
wenzelm
parents: 56896
diff changeset
   183
      NONE => st0
60076
e24f59cba23c tuned messages;
wenzelm
parents: 60027
diff changeset
   184
    | SOME st => (Output.error_message (Toplevel.type_error tr ^ " -- using reset state"); st))
56937
d11d11da0d90 smarter recovery from toplevel type error;
wenzelm
parents: 56896
diff changeset
   185
  end) ();
d11d11da0d90 smarter recovery from toplevel type error;
wenzelm
parents: 56896
diff changeset
   186
58923
cb9b69cca999 more explicit Keyword.keywords;
wenzelm
parents: 58862
diff changeset
   187
fun run keywords int tr st =
68130
6fb85346cb79 clarified future scheduling parameters, with support for parallel_limit;
wenzelm
parents: 67570
diff changeset
   188
  if Future.proofs_enabled 1 andalso Keyword.is_diag keywords (Toplevel.name_of tr) then
69887
b9985133805d added semantic document markers;
wenzelm
parents: 69886
diff changeset
   189
    let
b9985133805d added semantic document markers;
wenzelm
parents: 69886
diff changeset
   190
      val (tr1, tr2) = Toplevel.fork_presentation tr;
b9985133805d added semantic document markers;
wenzelm
parents: 69886
diff changeset
   191
      val _ =
b9985133805d added semantic document markers;
wenzelm
parents: 69886
diff changeset
   192
        Execution.fork {name = "Toplevel.diag", pos = Toplevel.pos_of tr, pri = ~1}
b9985133805d added semantic document markers;
wenzelm
parents: 69886
diff changeset
   193
          (fn () => Toplevel.command_exception int tr1 st);
b9985133805d added semantic document markers;
wenzelm
parents: 69886
diff changeset
   194
    in Toplevel.command_errors int tr2 st end
51284
59a03019f3bf fork diagnostic commands (theory loader and PIDE interaction);
wenzelm
parents: 51266
diff changeset
   195
  else Toplevel.command_errors int tr st;
47336
bed4b2738d8a separate module for prover command execution;
wenzelm
parents:
diff changeset
   196
78725
3c02ad5a1586 clarified treatment of exceptions: avoid catch-all handlers;
wenzelm
parents: 78713
diff changeset
   197
fun check_comments ctxt =
3c02ad5a1586 clarified treatment of exceptions: avoid catch-all handlers;
wenzelm
parents: 78713
diff changeset
   198
  Document_Output.check_comments ctxt o Input.source_explode o Token.input_of;
3c02ad5a1586 clarified treatment of exceptions: avoid catch-all handlers;
wenzelm
parents: 78713
diff changeset
   199
67570
c1fe89e9a00b just one check of formal comments;
wenzelm
parents: 67569
diff changeset
   200
fun check_token_comments ctxt tok =
78725
3c02ad5a1586 clarified treatment of exceptions: avoid catch-all handlers;
wenzelm
parents: 78713
diff changeset
   201
  (case Exn.result (fn () => check_comments ctxt tok) () of
3c02ad5a1586 clarified treatment of exceptions: avoid catch-all handlers;
wenzelm
parents: 78713
diff changeset
   202
    Exn.Res () => []
3c02ad5a1586 clarified treatment of exceptions: avoid catch-all handlers;
wenzelm
parents: 78713
diff changeset
   203
  | Exn.Exn exn => Runtime.exn_messages exn);
67377
143665524d8e check formal comments recursively, within arbitrary cartouches (unknown sublanguages);
wenzelm
parents: 67194
diff changeset
   204
67570
c1fe89e9a00b just one check of formal comments;
wenzelm
parents: 67569
diff changeset
   205
fun check_span_comments ctxt span tr =
c1fe89e9a00b just one check of formal comments;
wenzelm
parents: 67569
diff changeset
   206
  Toplevel.setmp_thread_position tr (fn () => maps (check_token_comments ctxt) span) ();
52510
a4a102237ded tuned signature;
wenzelm
parents: 52509
diff changeset
   207
73099
wenzelm
parents: 73098
diff changeset
   208
fun report_indent tr st =
63474
f66e3c3b0fb1 semantic indentation for unstructured proof scripts;
wenzelm
parents: 62924
diff changeset
   209
  (case try Toplevel.proof_of st of
f66e3c3b0fb1 semantic indentation for unstructured proof scripts;
wenzelm
parents: 62924
diff changeset
   210
    SOME prf =>
f66e3c3b0fb1 semantic indentation for unstructured proof scripts;
wenzelm
parents: 62924
diff changeset
   211
      let val keywords = Thy_Header.get_keywords (Proof.theory_of prf) in
f66e3c3b0fb1 semantic indentation for unstructured proof scripts;
wenzelm
parents: 62924
diff changeset
   212
        if Keyword.command_kind keywords (Toplevel.name_of tr) = SOME Keyword.prf_script then
73097
wenzelm
parents: 73096
diff changeset
   213
          (case try (Thm.nprems_of o #goal o Proof.goal) prf of
wenzelm
parents: 73096
diff changeset
   214
            NONE => ()
wenzelm
parents: 73096
diff changeset
   215
          | SOME 0 => ()
wenzelm
parents: 73096
diff changeset
   216
          | SOME n =>
80826
7feaa04d332b prefer static YXML.output_markup_only (without print_mode): Output.status is only relevant for PIDE (with print_mode "isabelle_process");
wenzelm
parents: 78787
diff changeset
   217
              let val report = YXML.output_markup_only (Markup.command_indent (n - 1));
73105
578a33042aa6 clarified: command keyword position is sufficient (amending 693a39f2cddc);
wenzelm
parents: 73100
diff changeset
   218
              in Toplevel.setmp_thread_position tr (fn () => Output.report [report]) () end)
63474
f66e3c3b0fb1 semantic indentation for unstructured proof scripts;
wenzelm
parents: 62924
diff changeset
   219
        else ()
f66e3c3b0fb1 semantic indentation for unstructured proof scripts;
wenzelm
parents: 62924
diff changeset
   220
      end
f66e3c3b0fb1 semantic indentation for unstructured proof scripts;
wenzelm
parents: 62924
diff changeset
   221
  | NONE => ());
f66e3c3b0fb1 semantic indentation for unstructured proof scripts;
wenzelm
parents: 62924
diff changeset
   222
73097
wenzelm
parents: 73096
diff changeset
   223
fun status tr m =
80826
7feaa04d332b prefer static YXML.output_markup_only (without print_mode): Output.status is only relevant for PIDE (with print_mode "isabelle_process");
wenzelm
parents: 78787
diff changeset
   224
  Toplevel.setmp_thread_position tr (fn () => Output.status [YXML.output_markup_only m]) ();
73097
wenzelm
parents: 73096
diff changeset
   225
59472
513300fa2d09 discontinued special treatment of malformed commands (reverting e46cd0d26481), i.e. errors in outer syntax failure are treated like errors in inner syntax, name space lookup etc.;
wenzelm
parents: 59466
diff changeset
   226
fun eval_state keywords span tr ({state, ...}: eval_state) =
513300fa2d09 discontinued special treatment of malformed commands (reverting e46cd0d26481), i.e. errors in outer syntax failure are treated like errors in inner syntax, name space lookup etc.;
wenzelm
parents: 59466
diff changeset
   227
  let
78713
a44ac17ae227 clarified modules;
wenzelm
parents: 78705
diff changeset
   228
    val _ = Isabelle_Thread.expose_interrupt ();
47336
bed4b2738d8a separate module for prover command execution;
wenzelm
parents:
diff changeset
   229
59472
513300fa2d09 discontinued special treatment of malformed commands (reverting e46cd0d26481), i.e. errors in outer syntax failure are treated like errors in inner syntax, name space lookup etc.;
wenzelm
parents: 59466
diff changeset
   230
    val st = reset_state keywords tr state;
56937
d11d11da0d90 smarter recovery from toplevel type error;
wenzelm
parents: 56896
diff changeset
   231
73099
wenzelm
parents: 73098
diff changeset
   232
    val _ = report_indent tr st;
59472
513300fa2d09 discontinued special treatment of malformed commands (reverting e46cd0d26481), i.e. errors in outer syntax failure are treated like errors in inner syntax, name space lookup etc.;
wenzelm
parents: 59466
diff changeset
   233
    val _ = status tr Markup.running;
513300fa2d09 discontinued special treatment of malformed commands (reverting e46cd0d26481), i.e. errors in outer syntax failure are treated like errors in inner syntax, name space lookup etc.;
wenzelm
parents: 59466
diff changeset
   234
    val (errs1, result) = run keywords true tr st;
67381
146757999c8d theory Pure is default presentation context;
wenzelm
parents: 67377
diff changeset
   235
    val errs2 =
146757999c8d theory Pure is default presentation context;
wenzelm
parents: 67377
diff changeset
   236
      (case result of
146757999c8d theory Pure is default presentation context;
wenzelm
parents: 67377
diff changeset
   237
        NONE => []
69892
f752f3993db8 tuned -- Toplevel.presentation_context is total;
wenzelm
parents: 69891
diff changeset
   238
      | SOME st' => check_span_comments (Toplevel.presentation_context st') span tr);
59472
513300fa2d09 discontinued special treatment of malformed commands (reverting e46cd0d26481), i.e. errors in outer syntax failure are treated like errors in inner syntax, name space lookup etc.;
wenzelm
parents: 59466
diff changeset
   239
    val errs = errs1 @ errs2;
513300fa2d09 discontinued special treatment of malformed commands (reverting e46cd0d26481), i.e. errors in outer syntax failure are treated like errors in inner syntax, name space lookup etc.;
wenzelm
parents: 59466
diff changeset
   240
    val _ = List.app (Future.error_message (Toplevel.pos_of tr)) errs;
513300fa2d09 discontinued special treatment of malformed commands (reverting e46cd0d26481), i.e. errors in outer syntax failure are treated like errors in inner syntax, name space lookup etc.;
wenzelm
parents: 59466
diff changeset
   241
  in
513300fa2d09 discontinued special treatment of malformed commands (reverting e46cd0d26481), i.e. errors in outer syntax failure are treated like errors in inner syntax, name space lookup etc.;
wenzelm
parents: 59466
diff changeset
   242
    (case result of
513300fa2d09 discontinued special treatment of malformed commands (reverting e46cd0d26481), i.e. errors in outer syntax failure are treated like errors in inner syntax, name space lookup etc.;
wenzelm
parents: 59466
diff changeset
   243
      NONE =>
513300fa2d09 discontinued special treatment of malformed commands (reverting e46cd0d26481), i.e. errors in outer syntax failure are treated like errors in inner syntax, name space lookup etc.;
wenzelm
parents: 59466
diff changeset
   244
        let
513300fa2d09 discontinued special treatment of malformed commands (reverting e46cd0d26481), i.e. errors in outer syntax failure are treated like errors in inner syntax, name space lookup etc.;
wenzelm
parents: 59466
diff changeset
   245
          val _ = status tr Markup.failed;
513300fa2d09 discontinued special treatment of malformed commands (reverting e46cd0d26481), i.e. errors in outer syntax failure are treated like errors in inner syntax, name space lookup etc.;
wenzelm
parents: 59466
diff changeset
   246
          val _ = status tr Markup.finished;
78681
38fe769658be clarified modules;
wenzelm
parents: 78279
diff changeset
   247
          val _ =
78787
a7e4b412cc7c tuned signature, following Isabelle/Scala;
wenzelm
parents: 78725
diff changeset
   248
            if null errs then (status tr Markup.canceled; Isabelle_Thread.raise_interrupt ())
78681
38fe769658be clarified modules;
wenzelm
parents: 78279
diff changeset
   249
            else ();
59472
513300fa2d09 discontinued special treatment of malformed commands (reverting e46cd0d26481), i.e. errors in outer syntax failure are treated like errors in inner syntax, name space lookup etc.;
wenzelm
parents: 59466
diff changeset
   250
        in {failed = true, command = tr, state = st} end
513300fa2d09 discontinued special treatment of malformed commands (reverting e46cd0d26481), i.e. errors in outer syntax failure are treated like errors in inner syntax, name space lookup etc.;
wenzelm
parents: 59466
diff changeset
   251
    | SOME st' =>
513300fa2d09 discontinued special treatment of malformed commands (reverting e46cd0d26481), i.e. errors in outer syntax failure are treated like errors in inner syntax, name space lookup etc.;
wenzelm
parents: 59466
diff changeset
   252
        let
68884
9b97d0b20d95 clarified quasi_consolidated state: ensure that exports are present for ok nodes;
wenzelm
parents: 68877
diff changeset
   253
          val _ =
9b97d0b20d95 clarified quasi_consolidated state: ensure that exports are present for ok nodes;
wenzelm
parents: 68877
diff changeset
   254
            if Keyword.is_theory_end keywords (Toplevel.name_of tr) andalso
9b97d0b20d95 clarified quasi_consolidated state: ensure that exports are present for ok nodes;
wenzelm
parents: 68877
diff changeset
   255
              can (Toplevel.end_theory Position.none) st'
9b97d0b20d95 clarified quasi_consolidated state: ensure that exports are present for ok nodes;
wenzelm
parents: 68877
diff changeset
   256
            then status tr Markup.finalized else ();
68886
1167f2d8a167 more robust: avoid race-condition of terminated vs. consolidated;
wenzelm
parents: 68884
diff changeset
   257
          val _ = status tr Markup.finished;
59472
513300fa2d09 discontinued special treatment of malformed commands (reverting e46cd0d26481), i.e. errors in outer syntax failure are treated like errors in inner syntax, name space lookup etc.;
wenzelm
parents: 59466
diff changeset
   258
        in {failed = false, command = tr, state = st'} end)
513300fa2d09 discontinued special treatment of malformed commands (reverting e46cd0d26481), i.e. errors in outer syntax failure are treated like errors in inner syntax, name space lookup etc.;
wenzelm
parents: 59466
diff changeset
   259
  end;
47336
bed4b2738d8a separate module for prover command execution;
wenzelm
parents:
diff changeset
   260
52534
341ae9cd4743 tuned signature;
wenzelm
parents: 52533
diff changeset
   261
in
341ae9cd4743 tuned signature;
wenzelm
parents: 52533
diff changeset
   262
68184
6c693b2700b3 support for dynamic document output while editing;
wenzelm
parents: 68130
diff changeset
   263
fun eval keywords master_dir init blobs_info command_id span eval0 =
52534
341ae9cd4743 tuned signature;
wenzelm
parents: 52533
diff changeset
   264
  let
341ae9cd4743 tuned signature;
wenzelm
parents: 52533
diff changeset
   265
    val exec_id = Document_ID.make ();
341ae9cd4743 tuned signature;
wenzelm
parents: 52533
diff changeset
   266
    fun process () =
341ae9cd4743 tuned signature;
wenzelm
parents: 52533
diff changeset
   267
      let
58928
23d0ffd48006 plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents: 58923
diff changeset
   268
        val eval_state0 = eval_result eval0;
23d0ffd48006 plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents: 58923
diff changeset
   269
        val thy = read_thy (#state eval_state0);
52534
341ae9cd4743 tuned signature;
wenzelm
parents: 52533
diff changeset
   270
        val tr =
341ae9cd4743 tuned signature;
wenzelm
parents: 52533
diff changeset
   271
          Position.setmp_thread_data (Position.id_only (Document_ID.print exec_id))
59689
7968c57ea240 simplified Command.resolve_files in ML, using blobs_index from Scala;
wenzelm
parents: 59685
diff changeset
   272
            (fn () =>
7968c57ea240 simplified Command.resolve_files in ML, using blobs_index from Scala;
wenzelm
parents: 59685
diff changeset
   273
              read keywords thy master_dir init blobs_info span |> Toplevel.exec_id exec_id) ();
58934
385a4cc7426f prefer externally provided keywords -- Command.read_thy may degenerate to bootstrap_thy in case of errors;
wenzelm
parents: 58928
diff changeset
   274
      in eval_state keywords span tr eval_state0 end;
68184
6c693b2700b3 support for dynamic document output while editing;
wenzelm
parents: 68130
diff changeset
   275
  in
68874
wenzelm
parents: 68871
diff changeset
   276
    Eval {command_id = command_id, exec_id = exec_id,
wenzelm
parents: 68871
diff changeset
   277
      eval_process = Lazy.lazy_name "Command.eval" process}
68184
6c693b2700b3 support for dynamic document output while editing;
wenzelm
parents: 68130
diff changeset
   278
  end;
52534
341ae9cd4743 tuned signature;
wenzelm
parents: 52533
diff changeset
   279
47336
bed4b2738d8a separate module for prover command execution;
wenzelm
parents:
diff changeset
   280
end;
bed4b2738d8a separate module for prover command execution;
wenzelm
parents:
diff changeset
   281
52509
2193d2c7f586 tuned signature;
wenzelm
parents: 51605
diff changeset
   282
2193d2c7f586 tuned signature;
wenzelm
parents: 51605
diff changeset
   283
(* print *)
2193d2c7f586 tuned signature;
wenzelm
parents: 51605
diff changeset
   284
52600
75afb82daf5c more abstract types;
wenzelm
parents: 52598
diff changeset
   285
datatype print = Print of
52850
9fff9f78240a support print functions with explicit arguments, as provided by overlays;
wenzelm
parents: 52785
diff changeset
   286
 {name: string, args: string list, delay: Time.time option, pri: int, persistent: bool,
59193
59f1591a11cb eliminated Document.execution frontier (again, see 627fb639a2d9): just run into older execution, potentially stalling worker thread, but without global delay due to long-running tasks (notably sledgehammer);
wenzelm
parents: 59188
diff changeset
   287
  exec_id: Document_ID.exec, print_process: unit lazy};
52600
75afb82daf5c more abstract types;
wenzelm
parents: 52598
diff changeset
   288
56291
e79f76a48449 added Execution.print: accumulate print operations for some command execution, which are applied later and print time;
wenzelm
parents: 56265
diff changeset
   289
fun print_exec_id (Print {exec_id, ...}) = exec_id;
59058
a78612c67ec0 renamed "pairself" to "apply2", in accordance to @{apply 2};
wenzelm
parents: 58934
diff changeset
   290
val print_eq = op = o apply2 print_exec_id;
76418
wenzelm
parents: 76416
diff changeset
   291
fun print_equiv (name', args') (Print {name, args, ...}) = name' = name andalso args' = args;
56291
e79f76a48449 added Execution.print: accumulate print operations for some command execution, which are applied later and print time;
wenzelm
parents: 56265
diff changeset
   292
52526
d234cb6b60e3 more Command.memo operations;
wenzelm
parents: 52516
diff changeset
   293
type print_fn = Toplevel.transition -> Toplevel.state -> unit;
52515
0dcadc90550b more print function parameters;
wenzelm
parents: 52511
diff changeset
   294
52647
45ce95b8bf69 determine print function parameters dynamically, e.g. depending on runtime options;
wenzelm
parents: 52619
diff changeset
   295
type print_function =
58923
cb9b69cca999 more explicit Keyword.keywords;
wenzelm
parents: 58862
diff changeset
   296
  {keywords: Keyword.keywords, command_name: string, args: string list, exec_id: Document_ID.exec} ->
52953
2c927b7501c5 explicit "strict" flag for print functions (flipped internal meaning);
wenzelm
parents: 52853
diff changeset
   297
    {delay: Time.time option, pri: int, persistent: bool, strict: bool, print_fn: print_fn} option;
52647
45ce95b8bf69 determine print function parameters dynamically, e.g. depending on runtime options;
wenzelm
parents: 52619
diff changeset
   298
52511
d5d2093ff224 allow multiple print functions;
wenzelm
parents: 52510
diff changeset
   299
local
d5d2093ff224 allow multiple print functions;
wenzelm
parents: 52510
diff changeset
   300
52647
45ce95b8bf69 determine print function parameters dynamically, e.g. depending on runtime options;
wenzelm
parents: 52619
diff changeset
   301
val print_functions =
45ce95b8bf69 determine print function parameters dynamically, e.g. depending on runtime options;
wenzelm
parents: 52619
diff changeset
   302
  Synchronized.var "Command.print_functions" ([]: (string * print_function) list);
52511
d5d2093ff224 allow multiple print functions;
wenzelm
parents: 52510
diff changeset
   303
78725
3c02ad5a1586 clarified treatment of exceptions: avoid catch-all handlers;
wenzelm
parents: 78713
diff changeset
   304
fun print_wrapper tr opt_context =
3c02ad5a1586 clarified treatment of exceptions: avoid catch-all handlers;
wenzelm
parents: 78713
diff changeset
   305
  Toplevel.setmp_thread_position tr o Runtime.controlled_execution opt_context;
3c02ad5a1586 clarified treatment of exceptions: avoid catch-all handlers;
wenzelm
parents: 78713
diff changeset
   306
56265
785569927666 discontinued Toplevel.debug in favour of system option "exception_trace";
wenzelm
parents: 56034
diff changeset
   307
fun print_error tr opt_context e =
78725
3c02ad5a1586 clarified treatment of exceptions: avoid catch-all handlers;
wenzelm
parents: 78713
diff changeset
   308
  (case Exn.result (fn () => print_wrapper tr opt_context e ()) () of
3c02ad5a1586 clarified treatment of exceptions: avoid catch-all handlers;
wenzelm
parents: 78713
diff changeset
   309
    Exn.Res res => res
3c02ad5a1586 clarified treatment of exceptions: avoid catch-all handlers;
wenzelm
parents: 78713
diff changeset
   310
  | Exn.Exn exn => List.app (Future.error_message (Toplevel.pos_of tr)) (Runtime.exn_messages exn));
52516
b5b3c888df9f more exception handling -- make print functions total;
wenzelm
parents: 52515
diff changeset
   311
59193
59f1591a11cb eliminated Document.execution frontier (again, see 627fb639a2d9): just run into older execution, potentially stalling worker thread, but without global delay due to long-running tasks (notably sledgehammer);
wenzelm
parents: 59188
diff changeset
   312
fun print_finished (Print {print_process, ...}) = Lazy.is_finished print_process;
52656
9437f440ef3f keep persistent prints only if actually finished;
wenzelm
parents: 52651
diff changeset
   313
52600
75afb82daf5c more abstract types;
wenzelm
parents: 52598
diff changeset
   314
fun print_persistent (Print {persistent, ...}) = persistent;
52596
40298d383463 global management of command execution fragments;
wenzelm
parents: 52586
diff changeset
   315
52853
4ab66773a41f prefer canonical order, to avoid potential fluctuation due to front-end edits;
wenzelm
parents: 52850
diff changeset
   316
val overlay_ord = prod_ord string_ord (list_ord string_ord);
4ab66773a41f prefer canonical order, to avoid potential fluctuation due to front-end edits;
wenzelm
parents: 52850
diff changeset
   317
68333
wenzelm
parents: 68184
diff changeset
   318
fun make_print (name, args) {delay, pri, persistent, strict, print_fn} eval =
wenzelm
parents: 68184
diff changeset
   319
  let
wenzelm
parents: 68184
diff changeset
   320
    val exec_id = Document_ID.make ();
wenzelm
parents: 68184
diff changeset
   321
    fun process () =
wenzelm
parents: 68184
diff changeset
   322
      let
wenzelm
parents: 68184
diff changeset
   323
        val {failed, command, state = st', ...} = eval_result eval;
wenzelm
parents: 68184
diff changeset
   324
        val tr = Toplevel.exec_id exec_id command;
wenzelm
parents: 68184
diff changeset
   325
        val opt_context = try Toplevel.generic_theory_of st';
wenzelm
parents: 68184
diff changeset
   326
      in
wenzelm
parents: 68184
diff changeset
   327
        if failed andalso strict then ()
wenzelm
parents: 68184
diff changeset
   328
        else print_error tr opt_context (fn () => print_fn tr st')
wenzelm
parents: 68184
diff changeset
   329
      end;
wenzelm
parents: 68184
diff changeset
   330
  in
wenzelm
parents: 68184
diff changeset
   331
    Print {
wenzelm
parents: 68184
diff changeset
   332
      name = name, args = args, delay = delay, pri = pri, persistent = persistent,
wenzelm
parents: 68184
diff changeset
   333
      exec_id = exec_id, print_process = Lazy.lazy_name "Command.print" process}
wenzelm
parents: 68184
diff changeset
   334
  end;
wenzelm
parents: 68184
diff changeset
   335
wenzelm
parents: 68184
diff changeset
   336
fun bad_print name_args exn =
wenzelm
parents: 68184
diff changeset
   337
  make_print name_args {delay = NONE, pri = 0, persistent = false,
wenzelm
parents: 68184
diff changeset
   338
    strict = false, print_fn = fn _ => fn _ => Exn.reraise exn};
wenzelm
parents: 68184
diff changeset
   339
52511
d5d2093ff224 allow multiple print functions;
wenzelm
parents: 52510
diff changeset
   340
in
52509
2193d2c7f586 tuned signature;
wenzelm
parents: 51605
diff changeset
   341
68344
3bb44c25ce8b clarified priority;
wenzelm
parents: 68334
diff changeset
   342
fun print0 {pri, print_fn} =
68334
ed40728c45d0 support for anonymous print function values;
wenzelm
parents: 68333
diff changeset
   343
  make_print ("", [serial_string ()])
68344
3bb44c25ce8b clarified priority;
wenzelm
parents: 68334
diff changeset
   344
    {delay = NONE, pri = pri, persistent = true, strict = true, print_fn = print_fn};
68334
ed40728c45d0 support for anonymous print function values;
wenzelm
parents: 68333
diff changeset
   345
76430
bb96846e27f8 tuned signature;
wenzelm
parents: 76424
diff changeset
   346
fun print keywords visible overlays command_name eval old_prints =
52570
26d84a0b9209 clarified Command.print: update old prints here;
wenzelm
parents: 52566
diff changeset
   347
  let
52850
9fff9f78240a support print functions with explicit arguments, as provided by overlays;
wenzelm
parents: 52785
diff changeset
   348
    val print_functions = Synchronized.value print_functions;
9fff9f78240a support print functions with explicit arguments, as provided by overlays;
wenzelm
parents: 52785
diff changeset
   349
68333
wenzelm
parents: 68184
diff changeset
   350
    fun new_print (name, args) get_pr =
52570
26d84a0b9209 clarified Command.print: update old prints here;
wenzelm
parents: 52566
diff changeset
   351
      let
58923
cb9b69cca999 more explicit Keyword.keywords;
wenzelm
parents: 58862
diff changeset
   352
        val params =
cb9b69cca999 more explicit Keyword.keywords;
wenzelm
parents: 58862
diff changeset
   353
         {keywords = keywords,
cb9b69cca999 more explicit Keyword.keywords;
wenzelm
parents: 58862
diff changeset
   354
          command_name = command_name,
cb9b69cca999 more explicit Keyword.keywords;
wenzelm
parents: 58862
diff changeset
   355
          args = args,
cb9b69cca999 more explicit Keyword.keywords;
wenzelm
parents: 58862
diff changeset
   356
          exec_id = eval_exec_id eval};
52570
26d84a0b9209 clarified Command.print: update old prints here;
wenzelm
parents: 52566
diff changeset
   357
      in
56303
4cc3f4db3447 clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
wenzelm
parents: 56292
diff changeset
   358
        (case Exn.capture (Runtime.controlled_execution NONE get_pr) params of
52570
26d84a0b9209 clarified Command.print: update old prints here;
wenzelm
parents: 52566
diff changeset
   359
          Exn.Res NONE => NONE
68333
wenzelm
parents: 68184
diff changeset
   360
        | Exn.Res (SOME pr) => SOME (make_print (name, args) pr eval)
wenzelm
parents: 68184
diff changeset
   361
        | Exn.Exn exn => SOME (bad_print (name, args) exn eval))
52570
26d84a0b9209 clarified Command.print: update old prints here;
wenzelm
parents: 52566
diff changeset
   362
      end;
26d84a0b9209 clarified Command.print: update old prints here;
wenzelm
parents: 52566
diff changeset
   363
68333
wenzelm
parents: 68184
diff changeset
   364
    fun get_print (name, args) =
76418
wenzelm
parents: 76416
diff changeset
   365
      (case find_first (print_equiv (name, args)) old_prints of
52850
9fff9f78240a support print functions with explicit arguments, as provided by overlays;
wenzelm
parents: 52785
diff changeset
   366
        NONE =>
68333
wenzelm
parents: 68184
diff changeset
   367
          (case AList.lookup (op =) print_functions name of
wenzelm
parents: 68184
diff changeset
   368
            NONE =>
wenzelm
parents: 68184
diff changeset
   369
              SOME (bad_print (name, args) (ERROR ("Missing print function " ^ quote name)) eval)
wenzelm
parents: 68184
diff changeset
   370
          | SOME get_pr => new_print (name, args) get_pr)
52850
9fff9f78240a support print functions with explicit arguments, as provided by overlays;
wenzelm
parents: 52785
diff changeset
   371
      | some => some);
9fff9f78240a support print functions with explicit arguments, as provided by overlays;
wenzelm
parents: 52785
diff changeset
   372
68334
ed40728c45d0 support for anonymous print function values;
wenzelm
parents: 68333
diff changeset
   373
    val retained_prints =
ed40728c45d0 support for anonymous print function values;
wenzelm
parents: 68333
diff changeset
   374
      filter (fn print => print_finished print andalso print_persistent print) old_prints;
ed40728c45d0 support for anonymous print function values;
wenzelm
parents: 68333
diff changeset
   375
    val visible_prints =
76424
wenzelm
parents: 76418
diff changeset
   376
      if visible then
wenzelm
parents: 76418
diff changeset
   377
        fold (fn (name, _) => cons (name, [])) print_functions overlays
52853
4ab66773a41f prefer canonical order, to avoid potential fluctuation due to front-end edits;
wenzelm
parents: 52850
diff changeset
   378
        |> sort_distinct overlay_ord
52850
9fff9f78240a support print functions with explicit arguments, as provided by overlays;
wenzelm
parents: 52785
diff changeset
   379
        |> map_filter get_print
68334
ed40728c45d0 support for anonymous print function values;
wenzelm
parents: 68333
diff changeset
   380
      else [];
ed40728c45d0 support for anonymous print function values;
wenzelm
parents: 68333
diff changeset
   381
    val new_prints = visible_prints @ retained_prints;
52570
26d84a0b9209 clarified Command.print: update old prints here;
wenzelm
parents: 52566
diff changeset
   382
  in
52600
75afb82daf5c more abstract types;
wenzelm
parents: 52598
diff changeset
   383
    if eq_list print_eq (old_prints, new_prints) then NONE else SOME new_prints
52570
26d84a0b9209 clarified Command.print: update old prints here;
wenzelm
parents: 52566
diff changeset
   384
  end;
52511
d5d2093ff224 allow multiple print functions;
wenzelm
parents: 52510
diff changeset
   385
68366
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
   386
fun parallel_print (Print {pri, ...}) =
76436
9e5098cbf81f more antiquotations;
wenzelm
parents: 76430
diff changeset
   387
  pri <= 0 orelse (Future.enabled () andalso Options.default_bool \<^system_option>\<open>parallel_print\<close>);
68366
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
   388
52647
45ce95b8bf69 determine print function parameters dynamically, e.g. depending on runtime options;
wenzelm
parents: 52619
diff changeset
   389
fun print_function name f =
52511
d5d2093ff224 allow multiple print functions;
wenzelm
parents: 52510
diff changeset
   390
  Synchronized.change print_functions (fn funs =>
76416
wenzelm
parents: 76415
diff changeset
   391
   (if name = "" then error "Unnamed print function"
wenzelm
parents: 76415
diff changeset
   392
    else if AList.defined (op =) funs name then
wenzelm
parents: 76415
diff changeset
   393
      warning ("Redefining command print function: " ^ quote name)
wenzelm
parents: 76415
diff changeset
   394
    else ();
52647
45ce95b8bf69 determine print function parameters dynamically, e.g. depending on runtime options;
wenzelm
parents: 52619
diff changeset
   395
    AList.update (op =) (name, f) funs));
52511
d5d2093ff224 allow multiple print functions;
wenzelm
parents: 52510
diff changeset
   396
52571
344527354323 allow to remove print functions;
wenzelm
parents: 52570
diff changeset
   397
fun no_print_function name =
344527354323 allow to remove print functions;
wenzelm
parents: 52570
diff changeset
   398
  Synchronized.change print_functions (filter_out (equal name o #1));
344527354323 allow to remove print functions;
wenzelm
parents: 52570
diff changeset
   399
52511
d5d2093ff224 allow multiple print functions;
wenzelm
parents: 52510
diff changeset
   400
end;
d5d2093ff224 allow multiple print functions;
wenzelm
parents: 52510
diff changeset
   401
52532
c81d76f7f63d tuned signature;
wenzelm
parents: 52530
diff changeset
   402
52600
75afb82daf5c more abstract types;
wenzelm
parents: 52598
diff changeset
   403
(* combined execution *)
75afb82daf5c more abstract types;
wenzelm
parents: 52598
diff changeset
   404
75afb82daf5c more abstract types;
wenzelm
parents: 52598
diff changeset
   405
type exec = eval * print list;
62895
54c2abe7e9a4 treat ROOT.ML as theory with header "theory ML_Root imports ML_Bootstrap begin";
wenzelm
parents: 62826
diff changeset
   406
54c2abe7e9a4 treat ROOT.ML as theory with header "theory ML_Root imports ML_Bootstrap begin";
wenzelm
parents: 62826
diff changeset
   407
fun init_exec opt_thy : exec =
68184
6c693b2700b3 support for dynamic document output while editing;
wenzelm
parents: 68130
diff changeset
   408
  (Eval
6c693b2700b3 support for dynamic document output while editing;
wenzelm
parents: 68130
diff changeset
   409
    {command_id = Document_ID.none, exec_id = Document_ID.none,
6c693b2700b3 support for dynamic document output while editing;
wenzelm
parents: 68130
diff changeset
   410
      eval_process = Lazy.value (init_eval_state opt_thy)}, []);
62895
54c2abe7e9a4 treat ROOT.ML as theory with header "theory ML_Root imports ML_Bootstrap begin";
wenzelm
parents: 62826
diff changeset
   411
54c2abe7e9a4 treat ROOT.ML as theory with header "theory ML_Root imports ML_Bootstrap begin";
wenzelm
parents: 62826
diff changeset
   412
val no_exec = init_exec NONE;
52532
c81d76f7f63d tuned signature;
wenzelm
parents: 52530
diff changeset
   413
52600
75afb82daf5c more abstract types;
wenzelm
parents: 52598
diff changeset
   414
fun exec_ids NONE = []
56291
e79f76a48449 added Execution.print: accumulate print operations for some command execution, which are applied later and print time;
wenzelm
parents: 56265
diff changeset
   415
  | exec_ids (SOME (eval, prints)) = eval_exec_id eval :: map print_exec_id prints;
52600
75afb82daf5c more abstract types;
wenzelm
parents: 52598
diff changeset
   416
75afb82daf5c more abstract types;
wenzelm
parents: 52598
diff changeset
   417
local
75afb82daf5c more abstract types;
wenzelm
parents: 52598
diff changeset
   418
59193
59f1591a11cb eliminated Document.execution frontier (again, see 627fb639a2d9): just run into older execution, potentially stalling worker thread, but without global delay due to long-running tasks (notably sledgehammer);
wenzelm
parents: 59188
diff changeset
   419
fun run_process execution_id exec_id process =
59f1591a11cb eliminated Document.execution frontier (again, see 627fb639a2d9): just run into older execution, potentially stalling worker thread, but without global delay due to long-running tasks (notably sledgehammer);
wenzelm
parents: 59188
diff changeset
   420
  let val group = Future.worker_subgroup () in
59f1591a11cb eliminated Document.execution frontier (again, see 627fb639a2d9): just run into older execution, potentially stalling worker thread, but without global delay due to long-running tasks (notably sledgehammer);
wenzelm
parents: 59188
diff changeset
   421
    if Execution.running execution_id exec_id [group] then
68931
fc5763d000e8 proper tast_context (amending 5f44ad150ed8);
wenzelm
parents: 68886
diff changeset
   422
      ignore (task_context group (fn () => Lazy.force_result {strict = true} process) ())
59193
59f1591a11cb eliminated Document.execution frontier (again, see 627fb639a2d9): just run into older execution, potentially stalling worker thread, but without global delay due to long-running tasks (notably sledgehammer);
wenzelm
parents: 59188
diff changeset
   423
    else ()
59f1591a11cb eliminated Document.execution frontier (again, see 627fb639a2d9): just run into older execution, potentially stalling worker thread, but without global delay due to long-running tasks (notably sledgehammer);
wenzelm
parents: 59188
diff changeset
   424
  end;
59f1591a11cb eliminated Document.execution frontier (again, see 627fb639a2d9): just run into older execution, potentially stalling worker thread, but without global delay due to long-running tasks (notably sledgehammer);
wenzelm
parents: 59188
diff changeset
   425
59328
b83d6c3c439a ignore print process even after fork, to avoid loosing active worker threads;
wenzelm
parents: 59193
diff changeset
   426
fun ignore_process process =
b83d6c3c439a ignore print process even after fork, to avoid loosing active worker threads;
wenzelm
parents: 59193
diff changeset
   427
  Lazy.is_running process orelse Lazy.is_finished process;
b83d6c3c439a ignore print process even after fork, to avoid loosing active worker threads;
wenzelm
parents: 59193
diff changeset
   428
68184
6c693b2700b3 support for dynamic document output while editing;
wenzelm
parents: 68130
diff changeset
   429
fun run_eval execution_id (Eval {exec_id, eval_process, ...}) =
59193
59f1591a11cb eliminated Document.execution frontier (again, see 627fb639a2d9): just run into older execution, potentially stalling worker thread, but without global delay due to long-running tasks (notably sledgehammer);
wenzelm
parents: 59188
diff changeset
   430
  if Lazy.is_finished eval_process then ()
59f1591a11cb eliminated Document.execution frontier (again, see 627fb639a2d9): just run into older execution, potentially stalling worker thread, but without global delay due to long-running tasks (notably sledgehammer);
wenzelm
parents: 59188
diff changeset
   431
  else run_process execution_id exec_id eval_process;
59f1591a11cb eliminated Document.execution frontier (again, see 627fb639a2d9): just run into older execution, potentially stalling worker thread, but without global delay due to long-running tasks (notably sledgehammer);
wenzelm
parents: 59188
diff changeset
   432
68366
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
   433
fun fork_print execution_id deps (Print {name, delay, pri, exec_id, print_process, ...}) =
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
   434
  let
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
   435
    val group = Future.worker_subgroup ();
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
   436
    fun fork () =
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
   437
      ignore ((singleton o Future.forks)
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
   438
        {name = name, group = SOME group, deps = deps, pri = pri, interrupts = true}
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
   439
        (fn () =>
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
   440
          if ignore_process print_process then ()
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
   441
          else run_process execution_id exec_id print_process));
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
   442
  in
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
   443
    (case delay of
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
   444
      NONE => fork ()
69826
1bea05713dde physical vs. logical events, the latter takes GC time into account;
wenzelm
parents: 69506
diff changeset
   445
    | SOME d => ignore (Event_Timer.request {physical = true} (Time.now () + d) fork))
68366
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
   446
  end;
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
   447
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
   448
fun run_print execution_id (print as Print {exec_id, print_process, ...}) =
59328
b83d6c3c439a ignore print process even after fork, to avoid loosing active worker threads;
wenzelm
parents: 59193
diff changeset
   449
  if ignore_process print_process then ()
68366
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
   450
  else if parallel_print print then fork_print execution_id [] print
59193
59f1591a11cb eliminated Document.execution frontier (again, see 627fb639a2d9): just run into older execution, potentially stalling worker thread, but without global delay due to long-running tasks (notably sledgehammer);
wenzelm
parents: 59188
diff changeset
   451
  else run_process execution_id exec_id print_process;
52559
ddaf277e0d8c more direct interleaving of eval/print and update/execution -- refrain from crude manipulation of max_threads;
wenzelm
parents: 52536
diff changeset
   452
52600
75afb82daf5c more abstract types;
wenzelm
parents: 52598
diff changeset
   453
in
75afb82daf5c more abstract types;
wenzelm
parents: 52598
diff changeset
   454
59193
59f1591a11cb eliminated Document.execution frontier (again, see 627fb639a2d9): just run into older execution, potentially stalling worker thread, but without global delay due to long-running tasks (notably sledgehammer);
wenzelm
parents: 59188
diff changeset
   455
fun exec execution_id (eval, prints) =
59f1591a11cb eliminated Document.execution frontier (again, see 627fb639a2d9): just run into older execution, potentially stalling worker thread, but without global delay due to long-running tasks (notably sledgehammer);
wenzelm
parents: 59188
diff changeset
   456
  (run_eval execution_id eval; List.app (run_print execution_id) prints);
52532
c81d76f7f63d tuned signature;
wenzelm
parents: 52530
diff changeset
   457
68366
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
   458
fun exec_parallel_prints execution_id deps (exec as (Eval {eval_process, ...}, prints)) =
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
   459
  if Lazy.is_finished eval_process
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
   460
  then (List.app (fork_print execution_id deps) prints; NONE)
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
   461
  else SOME exec;
cd387c55e085 fork parallel prints early in execution: avoid degradation of priority due to main eval task;
wenzelm
parents: 68344
diff changeset
   462
47336
bed4b2738d8a separate module for prover command execution;
wenzelm
parents:
diff changeset
   463
end;
bed4b2738d8a separate module for prover command execution;
wenzelm
parents:
diff changeset
   464
52600
75afb82daf5c more abstract types;
wenzelm
parents: 52598
diff changeset
   465
end;
76403
fb9c567a67cd clarified modules;
wenzelm
parents: 76014
diff changeset
   466
fb9c567a67cd clarified modules;
wenzelm
parents: 76014
diff changeset
   467
fb9c567a67cd clarified modules;
wenzelm
parents: 76014
diff changeset
   468
(* common print functions *)
fb9c567a67cd clarified modules;
wenzelm
parents: 76014
diff changeset
   469
fb9c567a67cd clarified modules;
wenzelm
parents: 76014
diff changeset
   470
val _ =
fb9c567a67cd clarified modules;
wenzelm
parents: 76014
diff changeset
   471
  Command.print_function "Execution.print"
fb9c567a67cd clarified modules;
wenzelm
parents: 76014
diff changeset
   472
    (fn {args, exec_id, ...} =>
fb9c567a67cd clarified modules;
wenzelm
parents: 76014
diff changeset
   473
      if null args then
fb9c567a67cd clarified modules;
wenzelm
parents: 76014
diff changeset
   474
        SOME {delay = NONE, pri = Task_Queue.urgent_pri + 2, persistent = false, strict = false,
fb9c567a67cd clarified modules;
wenzelm
parents: 76014
diff changeset
   475
          print_fn = fn _ => fn _ => Execution.fork_prints exec_id}
fb9c567a67cd clarified modules;
wenzelm
parents: 76014
diff changeset
   476
      else NONE);
fb9c567a67cd clarified modules;
wenzelm
parents: 76014
diff changeset
   477
fb9c567a67cd clarified modules;
wenzelm
parents: 76014
diff changeset
   478
val _ =
fb9c567a67cd clarified modules;
wenzelm
parents: 76014
diff changeset
   479
  Command.print_function "print_state"
fb9c567a67cd clarified modules;
wenzelm
parents: 76014
diff changeset
   480
    (fn {keywords, command_name, ...} =>
76436
9e5098cbf81f more antiquotations;
wenzelm
parents: 76430
diff changeset
   481
      if Options.default_bool \<^system_option>\<open>editor_output_state\<close>
9e5098cbf81f more antiquotations;
wenzelm
parents: 76430
diff changeset
   482
        andalso Keyword.is_printed keywords command_name
76403
fb9c567a67cd clarified modules;
wenzelm
parents: 76014
diff changeset
   483
      then
fb9c567a67cd clarified modules;
wenzelm
parents: 76014
diff changeset
   484
        SOME {delay = NONE, pri = Task_Queue.urgent_pri + 1, persistent = false, strict = false,
fb9c567a67cd clarified modules;
wenzelm
parents: 76014
diff changeset
   485
          print_fn = fn _ => fn st =>
82589
255dcbe53c50 clarified signature: more scalable output;
wenzelm
parents: 80826
diff changeset
   486
            if Toplevel.is_proof st
255dcbe53c50 clarified signature: more scalable output;
wenzelm
parents: 80826
diff changeset
   487
            then Output.state (Pretty.strings_of (Pretty.chunks (Toplevel.pretty_state st)))
76403
fb9c567a67cd clarified modules;
wenzelm
parents: 76014
diff changeset
   488
            else ()}
fb9c567a67cd clarified modules;
wenzelm
parents: 76014
diff changeset
   489
      else NONE);