| author | wenzelm | 
| Sat, 09 Apr 2022 15:28:55 +0200 | |
| changeset 75436 | 40630fec3b5d | 
| parent 74887 | 56247fdb8bbb | 
| child 75578 | d3ba143a7ab8 | 
| permissions | -rw-r--r-- | 
| 47336 | 1  | 
(* Title: Pure/PIDE/command.ML  | 
2  | 
Author: Makarius  | 
|
3  | 
||
| 52534 | 4  | 
Prover command execution: read -- eval -- print.  | 
| 47336 | 5  | 
*)  | 
6  | 
||
7  | 
signature COMMAND =  | 
|
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}
 | 
| 72841 | 10  | 
val read_file: Path.T -> Position.T -> bool -> Path.T -> Token.file  | 
| 
58928
 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 
wenzelm 
parents: 
58923 
diff
changeset
 | 
11  | 
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
 | 
12  | 
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
 | 
13  | 
blob Exn.result list * int -> Token.T list -> Toplevel.transition  | 
| 73044 | 14  | 
val read_span: Keyword.keywords -> Toplevel.state -> Path.T -> (unit -> theory) ->  | 
15  | 
Command_Span.span -> Toplevel.transition  | 
|
| 52600 | 16  | 
type eval  | 
| 
68184
 
6c693b2700b3
support for dynamic document output while editing;
 
wenzelm 
parents: 
68130 
diff
changeset
 | 
17  | 
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
 | 
18  | 
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
 | 
19  | 
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
 | 
20  | 
val eval_running: eval -> bool  | 
| 52772 | 21  | 
val eval_finished: eval -> bool  | 
| 
68184
 
6c693b2700b3
support for dynamic document output while editing;
 
wenzelm 
parents: 
68130 
diff
changeset
 | 
22  | 
val eval_result_command: eval -> Toplevel.transition  | 
| 52536 | 23  | 
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
 | 
24  | 
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
 | 
25  | 
blob Exn.result list * int -> Document_ID.command -> Token.T list -> eval -> eval  | 
| 52600 | 26  | 
type print  | 
| 68344 | 27  | 
type print_fn = Toplevel.transition -> Toplevel.state -> unit  | 
28  | 
  val print0: {pri: int, print_fn: print_fn} -> eval -> print
 | 
|
| 58923 | 29  | 
val print: bool -> (string * string list) list -> Keyword.keywords -> string ->  | 
| 
52850
 
9fff9f78240a
support print functions with explicit arguments, as provided by overlays;
 
wenzelm 
parents: 
52785 
diff
changeset
 | 
30  | 
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
 | 
31  | 
val parallel_print: print -> bool  | 
| 
52953
 
2c927b7501c5
explicit "strict" flag for print functions (flipped internal meaning);
 
wenzelm 
parents: 
52853 
diff
changeset
 | 
32  | 
type print_function =  | 
| 58923 | 33  | 
    {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
 | 
34  | 
      {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
 | 
35  | 
val print_function: string -> print_function -> unit  | 
| 52571 | 36  | 
val no_print_function: string -> unit  | 
| 52600 | 37  | 
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
 | 
38  | 
val init_exec: theory option -> exec  | 
| 52600 | 39  | 
val no_exec: exec  | 
40  | 
val exec_ids: exec option -> Document_ID.exec list  | 
|
| 52606 | 41  | 
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
 | 
42  | 
val exec_parallel_prints: Document_ID.execution -> Future.task list -> exec -> exec option  | 
| 47336 | 43  | 
end;  | 
44  | 
||
45  | 
structure Command: COMMAND =  | 
|
46  | 
struct  | 
|
47  | 
||
| 52536 | 48  | 
(** main phases of execution **)  | 
49  | 
||
| 
59466
 
6fab87db556c
ensure that running into older execution is interruptible (see also b91dc7ab3464);
 
wenzelm 
parents: 
59348 
diff
changeset
 | 
50  | 
fun task_context group f =  | 
| 
 
6fab87db556c
ensure that running into older execution is interruptible (see also b91dc7ab3464);
 
wenzelm 
parents: 
59348 
diff
changeset
 | 
51  | 
f  | 
| 
 
6fab87db556c
ensure that running into older execution is interruptible (see also b91dc7ab3464);
 
wenzelm 
parents: 
59348 
diff
changeset
 | 
52  | 
|> Future.interruptible_task  | 
| 
 
6fab87db556c
ensure that running into older execution is interruptible (see also b91dc7ab3464);
 
wenzelm 
parents: 
59348 
diff
changeset
 | 
53  | 
|> Future.task_context "Command.run_process" group;  | 
| 
 
6fab87db556c
ensure that running into older execution is interruptible (see also b91dc7ab3464);
 
wenzelm 
parents: 
59348 
diff
changeset
 | 
54  | 
|
| 
 
6fab87db556c
ensure that running into older execution is interruptible (see also b91dc7ab3464);
 
wenzelm 
parents: 
59348 
diff
changeset
 | 
55  | 
|
| 52510 | 56  | 
(* read *)  | 
| 52509 | 57  | 
|
| 
72747
 
5f9d66155081
clarified theory keywords: loaded_files are determined statically in Scala, but ML needs to do it semantically;
 
wenzelm 
parents: 
71675 
diff
changeset
 | 
58  | 
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
 | 
59  | 
|
| 72841 | 60  | 
fun read_file_node file_node master_dir pos delimited src_path =  | 
| 54526 | 61  | 
let  | 
| 71675 | 62  | 
val _ =  | 
63  | 
if Context_Position.pide_reports ()  | 
|
| 72841 | 64  | 
then Position.report pos (Markup.language_path delimited) else ();  | 
| 72950 | 65  | 
|
66  | 
fun read_file () =  | 
|
67  | 
let  | 
|
68  | 
val path = File.check_file (File.full_path master_dir src_path);  | 
|
69  | 
val text = File.read path;  | 
|
70  | 
val file_pos = Path.position path;  | 
|
71  | 
in (text, file_pos) end;  | 
|
72  | 
||
73  | 
fun read_url () =  | 
|
74  | 
let  | 
|
| 73566 | 75  | 
val text = Isabelle_System.download file_node;  | 
| 72950 | 76  | 
val file_pos = Position.file file_node;  | 
77  | 
in (text, file_pos) end;  | 
|
78  | 
||
79  | 
val (text, file_pos) =  | 
|
| 
56504
 
d71f4be7e287
tuned error -- allow user to click on hyperlink to open remote file;
 
wenzelm 
parents: 
56458 
diff
changeset
 | 
80  | 
(case try Url.explode file_node of  | 
| 72950 | 81  | 
NONE => read_file ()  | 
82  | 
| SOME (Url.File _) => read_file ()  | 
|
83  | 
| _ => read_url ());  | 
|
84  | 
||
| 
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
 | 
85  | 
val lines = split_lines text;  | 
| 
 
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
 | 
86  | 
val digest = SHA1.digest text;  | 
| 72950 | 87  | 
  in {src_path = src_path, lines = lines, digest = digest, pos = Position.copy_id pos file_pos} end
 | 
| 
59685
 
c043306d2598
clarified markup for embedded files, early before execution;
 
wenzelm 
parents: 
59472 
diff
changeset
 | 
88  | 
handle ERROR msg => error (msg ^ Position.here pos);  | 
| 
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
 | 
89  | 
|
| 
56504
 
d71f4be7e287
tuned error -- allow user to click on hyperlink to open remote file;
 
wenzelm 
parents: 
56458 
diff
changeset
 | 
90  | 
val read_file = read_file_node "";  | 
| 
 
d71f4be7e287
tuned error -- allow user to click on hyperlink to open remote file;
 
wenzelm 
parents: 
56458 
diff
changeset
 | 
91  | 
|
| 
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
 | 
92  | 
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
 | 
93  | 
|
| 
56447
 
1e77ed11f2f7
separate file_node vs. file_path, e.g. relevant on Windows for hyperlink to the latter;
 
wenzelm 
parents: 
56333 
diff
changeset
 | 
94  | 
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
 | 
95  | 
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
 | 
96  | 
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
 | 
97  | 
Position.file file_node |>  | 
| 74166 | 98  | 
(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
 | 
99  | 
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
 | 
100  | 
| 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
 | 
101  | 
  in {src_path = src_path, lines = lines, digest = digest, pos = file_pos} end
 | 
| 54526 | 102  | 
|
| 
72747
 
5f9d66155081
clarified theory keywords: loaded_files are determined statically in Scala, but ML needs to do it semantically;
 
wenzelm 
parents: 
71675 
diff
changeset
 | 
103  | 
fun resolve_files master_dir (blobs, blobs_index) toks =  | 
| 
57905
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57844 
diff
changeset
 | 
104  | 
(case Outer_Syntax.parse_spans toks of  | 
| 72841 | 105  | 
[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
 | 
106  | 
(case try (nth toks) blobs_index of  | 
| 
 
7968c57ea240
simplified Command.resolve_files in ML, using blobs_index from Scala;
 
wenzelm 
parents: 
59685 
diff
changeset
 | 
107  | 
SOME tok =>  | 
| 
 
7968c57ea240
simplified Command.resolve_files in ML, using blobs_index from Scala;
 
wenzelm 
parents: 
59685 
diff
changeset
 | 
108  | 
let  | 
| 72841 | 109  | 
val source = Token.input_of tok;  | 
110  | 
val pos = Input.pos_of source;  | 
|
111  | 
val delimited = Input.is_delimited source;  | 
|
112  | 
||
| 
72747
 
5f9d66155081
clarified theory keywords: loaded_files are determined statically in Scala, but ML needs to do it semantically;
 
wenzelm 
parents: 
71675 
diff
changeset
 | 
113  | 
            fun make_file (Exn.Res {file_node, src_path, content = NONE}) =
 | 
| 
59689
 
7968c57ea240
simplified Command.resolve_files in ML, using blobs_index from Scala;
 
wenzelm 
parents: 
59685 
diff
changeset
 | 
114  | 
Exn.interruptible_capture (fn () =>  | 
| 72841 | 115  | 
read_file_node file_node master_dir pos delimited src_path) ()  | 
| 
72747
 
5f9d66155081
clarified theory keywords: loaded_files are determined statically in Scala, but ML needs to do it semantically;
 
wenzelm 
parents: 
71675 
diff
changeset
 | 
116  | 
              | make_file (Exn.Res {file_node, src_path, content = SOME (digest, lines)}) =
 | 
| 72841 | 117  | 
(Position.report pos (Markup.language_path delimited);  | 
| 
60027
 
c42d65e11b6e
clarified language_path markup (again): exactly once *after* static phase, see also 83071f4c8ae6 and c043306d2598;
 
wenzelm 
parents: 
59944 
diff
changeset
 | 
118  | 
Exn.Res (blob_file src_path lines digest file_node))  | 
| 
72747
 
5f9d66155081
clarified theory keywords: loaded_files are determined statically in Scala, but ML needs to do it semantically;
 
wenzelm 
parents: 
71675 
diff
changeset
 | 
119  | 
| 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
 | 
120  | 
val files = map make_file blobs;  | 
| 
59689
 
7968c57ea240
simplified Command.resolve_files in ML, using blobs_index from Scala;
 
wenzelm 
parents: 
59685 
diff
changeset
 | 
121  | 
in  | 
| 
 
7968c57ea240
simplified Command.resolve_files in ML, using blobs_index from Scala;
 
wenzelm 
parents: 
59685 
diff
changeset
 | 
122  | 
toks |> map_index (fn (i, tok) =>  | 
| 
 
7968c57ea240
simplified Command.resolve_files in ML, using blobs_index from Scala;
 
wenzelm 
parents: 
59685 
diff
changeset
 | 
123  | 
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
 | 
124  | 
end  | 
| 
 
7968c57ea240
simplified Command.resolve_files in ML, using blobs_index from Scala;
 
wenzelm 
parents: 
59685 
diff
changeset
 | 
125  | 
| NONE => toks)  | 
| 
54519
 
5fed81762406
maintain blobs within document state: digest + text in ML, digest-only in Scala;
 
wenzelm 
parents: 
53976 
diff
changeset
 | 
126  | 
| _ => toks);  | 
| 
 
5fed81762406
maintain blobs within document state: digest + text in ML, digest-only in Scala;
 
wenzelm 
parents: 
53976 
diff
changeset
 | 
127  | 
|
| 
61379
 
c57820ceead3
more direct HTML presentation, without print mode;
 
wenzelm 
parents: 
61213 
diff
changeset
 | 
128  | 
fun reports_of_token keywords tok =  | 
| 
 
c57820ceead3
more direct HTML presentation, without print mode;
 
wenzelm 
parents: 
61213 
diff
changeset
 | 
129  | 
let  | 
| 
 
c57820ceead3
more direct HTML presentation, without print mode;
 
wenzelm 
parents: 
61213 
diff
changeset
 | 
130  | 
val malformed_symbols =  | 
| 
 
c57820ceead3
more direct HTML presentation, without print mode;
 
wenzelm 
parents: 
61213 
diff
changeset
 | 
131  | 
Input.source_explode (Token.input_of tok)  | 
| 
 
c57820ceead3
more direct HTML presentation, without print mode;
 
wenzelm 
parents: 
61213 
diff
changeset
 | 
132  | 
|> map_filter (fn (sym, pos) =>  | 
| 
 
c57820ceead3
more direct HTML presentation, without print mode;
 
wenzelm 
parents: 
61213 
diff
changeset
 | 
133  | 
if Symbol.is_malformed sym  | 
| 
64677
 
8dc24130e8fe
more uniform treatment of "bad" like other messages (with serial number);
 
wenzelm 
parents: 
63475 
diff
changeset
 | 
134  | 
then SOME ((pos, Markup.bad ()), "Malformed symbolic character") else NONE);  | 
| 
61379
 
c57820ceead3
more direct HTML presentation, without print mode;
 
wenzelm 
parents: 
61213 
diff
changeset
 | 
135  | 
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
 | 
136  | 
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
 | 
137  | 
in (is_malformed, reports) end;  | 
| 
 
c57820ceead3
more direct HTML presentation, without print mode;
 
wenzelm 
parents: 
61213 
diff
changeset
 | 
138  | 
|
| 
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
 | 
139  | 
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
 | 
140  | 
|
| 60095 | 141  | 
fun read_thy st = Toplevel.theory_of st  | 
142  | 
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
 | 
143  | 
|
| 
59689
 
7968c57ea240
simplified Command.resolve_files in ML, using blobs_index from Scala;
 
wenzelm 
parents: 
59685 
diff
changeset
 | 
144  | 
fun read keywords thy master_dir init blobs_info span =  | 
| 52510 | 145  | 
let  | 
| 
58928
 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 
wenzelm 
parents: 
58923 
diff
changeset
 | 
146  | 
val command_reports = Outer_Syntax.command_reports thy;  | 
| 
61379
 
c57820ceead3
more direct HTML presentation, without print mode;
 
wenzelm 
parents: 
61213 
diff
changeset
 | 
147  | 
val token_reports = map (reports_of_token keywords) span;  | 
| 
 
c57820ceead3
more direct HTML presentation, without print mode;
 
wenzelm 
parents: 
61213 
diff
changeset
 | 
148  | 
val _ = Position.reports_text (maps #2 token_reports @ maps command_reports span);  | 
| 69506 | 149  | 
|
| 74673 | 150  | 
val core_range = Token.core_range_of span;  | 
151  | 
val tr =  | 
|
152  | 
if exists #1 token_reports  | 
|
153  | 
then Toplevel.malformed (#1 core_range) "Malformed command syntax"  | 
|
154  | 
else Outer_Syntax.parse_span thy init (resolve_files master_dir blobs_info span);  | 
|
155  | 
val _ =  | 
|
156  | 
if Toplevel.is_ignored tr orelse Toplevel.is_malformed tr then ()  | 
|
157  | 
else Position.report (#1 core_range) (Markup.command_span (Toplevel.name_of tr));  | 
|
158  | 
in tr end;  | 
|
| 52509 | 159  | 
|
| 
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
 | 
160  | 
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
 | 
161  | 
|
| 73044 | 162  | 
fun read_span keywords st master_dir init =  | 
163  | 
Command_Span.content #> read keywords (read_thy st) master_dir init ([], ~1);  | 
|
164  | 
||
| 52509 | 165  | 
|
166  | 
(* eval *)  | 
|
| 47336 | 167  | 
|
| 
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
 | 
168  | 
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
 | 
169  | 
|
| 
 
54c2abe7e9a4
treat ROOT.ML as theory with header "theory ML_Root imports ML_Bootstrap begin";
 
wenzelm 
parents: 
62826 
diff
changeset
 | 
170  | 
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
 | 
171  | 
 {failed = false,
 | 
| 
 
54c2abe7e9a4
treat ROOT.ML as theory with header "theory ML_Root imports ML_Bootstrap begin";
 
wenzelm 
parents: 
62826 
diff
changeset
 | 
172  | 
command = Toplevel.empty,  | 
| 69883 | 173  | 
state =  | 
174  | 
(case opt_thy of  | 
|
| 69886 | 175  | 
NONE => Toplevel.init_toplevel ()  | 
| 69883 | 176  | 
| SOME thy => Toplevel.theory_toplevel thy)};  | 
| 52600 | 177  | 
|
| 
68184
 
6c693b2700b3
support for dynamic document output while editing;
 
wenzelm 
parents: 
68130 
diff
changeset
 | 
178  | 
datatype eval =  | 
| 
 
6c693b2700b3
support for dynamic document output while editing;
 
wenzelm 
parents: 
68130 
diff
changeset
 | 
179  | 
Eval of  | 
| 
 
6c693b2700b3
support for dynamic document output while editing;
 
wenzelm 
parents: 
68130 
diff
changeset
 | 
180  | 
    {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
 | 
181  | 
|
| 
 
6c693b2700b3
support for dynamic document output while editing;
 
wenzelm 
parents: 
68130 
diff
changeset
 | 
182  | 
fun eval_command_id (Eval {command_id, ...}) = command_id;
 | 
| 52600 | 183  | 
|
| 
56291
 
e79f76a48449
added Execution.print: accumulate print operations for some command execution, which are applied later and print time;
 
wenzelm 
parents: 
56265 
diff
changeset
 | 
184  | 
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
 | 
185  | 
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
 | 
186  | 
|
| 
56291
 
e79f76a48449
added Execution.print: accumulate print operations for some command execution, which are applied later and print time;
 
wenzelm 
parents: 
56265 
diff
changeset
 | 
187  | 
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
 | 
188  | 
fun eval_finished (Eval {eval_process, ...}) = Lazy.is_finished eval_process;
 | 
| 52772 | 189  | 
|
| 
59466
 
6fab87db556c
ensure that running into older execution is interruptible (see also b91dc7ab3464);
 
wenzelm 
parents: 
59348 
diff
changeset
 | 
190  | 
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
 | 
191  | 
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
 | 
192  | 
|
| 
68184
 
6c693b2700b3
support for dynamic document output while editing;
 
wenzelm 
parents: 
68130 
diff
changeset
 | 
193  | 
val eval_result_command = #command o eval_result;  | 
| 52600 | 194  | 
val eval_result_state = #state o eval_result;  | 
195  | 
||
| 47336 | 196  | 
local  | 
197  | 
||
| 58923 | 198  | 
fun reset_state keywords tr st0 = Toplevel.setmp_thread_position tr (fn () =>  | 
| 56937 | 199  | 
let  | 
200  | 
val name = Toplevel.name_of tr;  | 
|
201  | 
val res =  | 
|
| 58923 | 202  | 
if Keyword.is_theory_body keywords name then Toplevel.reset_theory st0  | 
203  | 
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
 | 
204  | 
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
 | 
205  | 
(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
 | 
206  | 
NONE => Toplevel.reset_theory st0  | 
| 
 
33d78e5e0a00
more robust reset_state: begin/end structure takes precedence over goal/proof structure;
 
wenzelm 
parents: 
68874 
diff
changeset
 | 
207  | 
| some => some)  | 
| 56937 | 208  | 
else NONE;  | 
209  | 
in  | 
|
210  | 
(case res of  | 
|
211  | 
NONE => st0  | 
|
| 60076 | 212  | 
| SOME st => (Output.error_message (Toplevel.type_error tr ^ " -- using reset state"); st))  | 
| 56937 | 213  | 
end) ();  | 
214  | 
||
| 58923 | 215  | 
fun run keywords int tr st =  | 
| 
68130
 
6fb85346cb79
clarified future scheduling parameters, with support for parallel_limit;
 
wenzelm 
parents: 
67570 
diff
changeset
 | 
216  | 
if Future.proofs_enabled 1 andalso Keyword.is_diag keywords (Toplevel.name_of tr) then  | 
| 69887 | 217  | 
let  | 
218  | 
val (tr1, tr2) = Toplevel.fork_presentation tr;  | 
|
219  | 
val _ =  | 
|
220  | 
        Execution.fork {name = "Toplevel.diag", pos = Toplevel.pos_of tr, pri = ~1}
 | 
|
221  | 
(fn () => Toplevel.command_exception int tr1 st);  | 
|
222  | 
in Toplevel.command_errors int tr2 st end  | 
|
| 
51284
 
59a03019f3bf
fork diagnostic commands (theory loader and PIDE interaction);
 
wenzelm 
parents: 
51266 
diff
changeset
 | 
223  | 
else Toplevel.command_errors int tr st;  | 
| 47336 | 224  | 
|
| 67570 | 225  | 
fun check_token_comments ctxt tok =  | 
| 73761 | 226  | 
(Document_Output.check_comments ctxt (Input.source_explode (Token.input_of tok)); [])  | 
| 67570 | 227  | 
handle exn =>  | 
228  | 
if Exn.is_interrupt exn then Exn.reraise exn  | 
|
229  | 
else Runtime.exn_messages exn;  | 
|
| 
67377
 
143665524d8e
check formal comments recursively, within arbitrary cartouches (unknown sublanguages);
 
wenzelm 
parents: 
67194 
diff
changeset
 | 
230  | 
|
| 67570 | 231  | 
fun check_span_comments ctxt span tr =  | 
232  | 
Toplevel.setmp_thread_position tr (fn () => maps (check_token_comments ctxt) span) ();  | 
|
| 52510 | 233  | 
|
| 73099 | 234  | 
fun report_indent tr st =  | 
| 
63474
 
f66e3c3b0fb1
semantic indentation for unstructured proof scripts;
 
wenzelm 
parents: 
62924 
diff
changeset
 | 
235  | 
(case try Toplevel.proof_of st of  | 
| 
 
f66e3c3b0fb1
semantic indentation for unstructured proof scripts;
 
wenzelm 
parents: 
62924 
diff
changeset
 | 
236  | 
SOME prf =>  | 
| 
 
f66e3c3b0fb1
semantic indentation for unstructured proof scripts;
 
wenzelm 
parents: 
62924 
diff
changeset
 | 
237  | 
let val keywords = Thy_Header.get_keywords (Proof.theory_of prf) in  | 
| 
 
f66e3c3b0fb1
semantic indentation for unstructured proof scripts;
 
wenzelm 
parents: 
62924 
diff
changeset
 | 
238  | 
if Keyword.command_kind keywords (Toplevel.name_of tr) = SOME Keyword.prf_script then  | 
| 73097 | 239  | 
(case try (Thm.nprems_of o #goal o Proof.goal) prf of  | 
240  | 
NONE => ()  | 
|
241  | 
| SOME 0 => ()  | 
|
242  | 
| SOME n =>  | 
|
| 
73105
 
578a33042aa6
clarified: command keyword position is sufficient (amending 693a39f2cddc);
 
wenzelm 
parents: 
73100 
diff
changeset
 | 
243  | 
let val report = Markup.markup_only (Markup.command_indent (n - 1));  | 
| 
 
578a33042aa6
clarified: command keyword position is sufficient (amending 693a39f2cddc);
 
wenzelm 
parents: 
73100 
diff
changeset
 | 
244  | 
in Toplevel.setmp_thread_position tr (fn () => Output.report [report]) () end)  | 
| 
63474
 
f66e3c3b0fb1
semantic indentation for unstructured proof scripts;
 
wenzelm 
parents: 
62924 
diff
changeset
 | 
245  | 
else ()  | 
| 
 
f66e3c3b0fb1
semantic indentation for unstructured proof scripts;
 
wenzelm 
parents: 
62924 
diff
changeset
 | 
246  | 
end  | 
| 
 
f66e3c3b0fb1
semantic indentation for unstructured proof scripts;
 
wenzelm 
parents: 
62924 
diff
changeset
 | 
247  | 
| NONE => ());  | 
| 
 
f66e3c3b0fb1
semantic indentation for unstructured proof scripts;
 
wenzelm 
parents: 
62924 
diff
changeset
 | 
248  | 
|
| 73097 | 249  | 
fun status tr m =  | 
250  | 
Toplevel.setmp_thread_position tr (fn () => Output.status [Markup.markup_only m]) ();  | 
|
251  | 
||
| 
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
 | 
252  | 
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
 | 
253  | 
let  | 
| 
62924
 
ce47945ce4fb
tuned signature -- closer to Exn.Interrupt.expose in Scala;
 
wenzelm 
parents: 
62895 
diff
changeset
 | 
254  | 
val _ = Thread_Attributes.expose_interrupt ();  | 
| 47336 | 255  | 
|
| 
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
 | 
256  | 
val st = reset_state keywords tr state;  | 
| 56937 | 257  | 
|
| 73099 | 258  | 
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
 | 
259  | 
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
 | 
260  | 
val (errs1, result) = run keywords true tr st;  | 
| 67381 | 261  | 
val errs2 =  | 
262  | 
(case result of  | 
|
263  | 
NONE => []  | 
|
| 69892 | 264  | 
| 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
 | 
265  | 
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
 | 
266  | 
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
 | 
267  | 
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
 | 
268  | 
(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
 | 
269  | 
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
 | 
270  | 
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
 | 
271  | 
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
 | 
272  | 
val _ = status tr Markup.finished;  | 
| 
68871
 
f5c76072db55
more explicit status for "canceled" command within theory node;
 
wenzelm 
parents: 
68868 
diff
changeset
 | 
273  | 
val _ = if null errs then (status tr Markup.canceled; Exn.interrupt ()) 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
 | 
274  | 
        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
 | 
275  | 
| 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
 | 
276  | 
let  | 
| 
68884
 
9b97d0b20d95
clarified quasi_consolidated state: ensure that exports are present for ok nodes;
 
wenzelm 
parents: 
68877 
diff
changeset
 | 
277  | 
val _ =  | 
| 
 
9b97d0b20d95
clarified quasi_consolidated state: ensure that exports are present for ok nodes;
 
wenzelm 
parents: 
68877 
diff
changeset
 | 
278  | 
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
 | 
279  | 
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
 | 
280  | 
then status tr Markup.finalized else ();  | 
| 
68886
 
1167f2d8a167
more robust: avoid race-condition of terminated vs. consolidated;
 
wenzelm 
parents: 
68884 
diff
changeset
 | 
281  | 
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
 | 
282  | 
        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
 | 
283  | 
end;  | 
| 47336 | 284  | 
|
| 52534 | 285  | 
in  | 
286  | 
||
| 
68184
 
6c693b2700b3
support for dynamic document output while editing;
 
wenzelm 
parents: 
68130 
diff
changeset
 | 
287  | 
fun eval keywords master_dir init blobs_info command_id span eval0 =  | 
| 52534 | 288  | 
let  | 
289  | 
val exec_id = Document_ID.make ();  | 
|
290  | 
fun process () =  | 
|
291  | 
let  | 
|
| 
58928
 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 
wenzelm 
parents: 
58923 
diff
changeset
 | 
292  | 
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
 | 
293  | 
val thy = read_thy (#state eval_state0);  | 
| 52534 | 294  | 
val tr =  | 
295  | 
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
 | 
296  | 
(fn () =>  | 
| 
 
7968c57ea240
simplified Command.resolve_files in ML, using blobs_index from Scala;
 
wenzelm 
parents: 
59685 
diff
changeset
 | 
297  | 
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
 | 
298  | 
in eval_state keywords span tr eval_state0 end;  | 
| 
68184
 
6c693b2700b3
support for dynamic document output while editing;
 
wenzelm 
parents: 
68130 
diff
changeset
 | 
299  | 
in  | 
| 68874 | 300  | 
    Eval {command_id = command_id, exec_id = exec_id,
 | 
301  | 
eval_process = Lazy.lazy_name "Command.eval" process}  | 
|
| 
68184
 
6c693b2700b3
support for dynamic document output while editing;
 
wenzelm 
parents: 
68130 
diff
changeset
 | 
302  | 
end;  | 
| 52534 | 303  | 
|
| 47336 | 304  | 
end;  | 
305  | 
||
| 52509 | 306  | 
|
307  | 
(* print *)  | 
|
308  | 
||
| 52600 | 309  | 
datatype print = Print of  | 
| 
52850
 
9fff9f78240a
support print functions with explicit arguments, as provided by overlays;
 
wenzelm 
parents: 
52785 
diff
changeset
 | 
310  | 
 {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
 | 
311  | 
exec_id: Document_ID.exec, print_process: unit lazy};  | 
| 52600 | 312  | 
|
| 
56291
 
e79f76a48449
added Execution.print: accumulate print operations for some command execution, which are applied later and print time;
 
wenzelm 
parents: 
56265 
diff
changeset
 | 
313  | 
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
 | 
314  | 
val print_eq = op = o apply2 print_exec_id;  | 
| 
56291
 
e79f76a48449
added Execution.print: accumulate print operations for some command execution, which are applied later and print time;
 
wenzelm 
parents: 
56265 
diff
changeset
 | 
315  | 
|
| 52526 | 316  | 
type print_fn = Toplevel.transition -> Toplevel.state -> unit;  | 
| 52515 | 317  | 
|
| 
52647
 
45ce95b8bf69
determine print function parameters dynamically, e.g. depending on runtime options;
 
wenzelm 
parents: 
52619 
diff
changeset
 | 
318  | 
type print_function =  | 
| 58923 | 319  | 
  {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
 | 
320  | 
    {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
 | 
321  | 
|
| 52511 | 322  | 
local  | 
323  | 
||
| 
52647
 
45ce95b8bf69
determine print function parameters dynamically, e.g. depending on runtime options;
 
wenzelm 
parents: 
52619 
diff
changeset
 | 
324  | 
val print_functions =  | 
| 
 
45ce95b8bf69
determine print function parameters dynamically, e.g. depending on runtime options;
 
wenzelm 
parents: 
52619 
diff
changeset
 | 
325  | 
Synchronized.var "Command.print_functions" ([]: (string * print_function) list);  | 
| 52511 | 326  | 
|
| 
56265
 
785569927666
discontinued Toplevel.debug in favour of system option "exception_trace";
 
wenzelm 
parents: 
56034 
diff
changeset
 | 
327  | 
fun print_error tr opt_context e =  | 
| 
56303
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56292 
diff
changeset
 | 
328  | 
(Toplevel.setmp_thread_position tr o Runtime.controlled_execution opt_context) e ()  | 
| 
52619
 
70d5f2f7d27f
reraise interrupts outside command regular transactions -- relevant for memo_stable;
 
wenzelm 
parents: 
52609 
diff
changeset
 | 
329  | 
handle exn =>  | 
| 62505 | 330  | 
if Exn.is_interrupt exn then Exn.reraise exn  | 
| 65948 | 331  | 
else 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
 | 
332  | 
|
| 
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
 | 
333  | 
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
 | 
334  | 
|
| 52600 | 335  | 
fun print_persistent (Print {persistent, ...}) = persistent;
 | 
| 
52596
 
40298d383463
global management of command execution fragments;
 
wenzelm 
parents: 
52586 
diff
changeset
 | 
336  | 
|
| 
52853
 
4ab66773a41f
prefer canonical order, to avoid potential fluctuation due to front-end edits;
 
wenzelm 
parents: 
52850 
diff
changeset
 | 
337  | 
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
 | 
338  | 
|
| 68333 | 339  | 
fun make_print (name, args) {delay, pri, persistent, strict, print_fn} eval =
 | 
340  | 
let  | 
|
341  | 
val exec_id = Document_ID.make ();  | 
|
342  | 
fun process () =  | 
|
343  | 
let  | 
|
344  | 
        val {failed, command, state = st', ...} = eval_result eval;
 | 
|
345  | 
val tr = Toplevel.exec_id exec_id command;  | 
|
346  | 
val opt_context = try Toplevel.generic_theory_of st';  | 
|
347  | 
in  | 
|
348  | 
if failed andalso strict then ()  | 
|
349  | 
else print_error tr opt_context (fn () => print_fn tr st')  | 
|
350  | 
end;  | 
|
351  | 
in  | 
|
352  | 
    Print {
 | 
|
353  | 
name = name, args = args, delay = delay, pri = pri, persistent = persistent,  | 
|
354  | 
exec_id = exec_id, print_process = Lazy.lazy_name "Command.print" process}  | 
|
355  | 
end;  | 
|
356  | 
||
357  | 
fun bad_print name_args exn =  | 
|
358  | 
  make_print name_args {delay = NONE, pri = 0, persistent = false,
 | 
|
359  | 
strict = false, print_fn = fn _ => fn _ => Exn.reraise exn};  | 
|
360  | 
||
| 52511 | 361  | 
in  | 
| 52509 | 362  | 
|
| 68344 | 363  | 
fun print0 {pri, print_fn} =
 | 
| 68334 | 364  | 
  make_print ("", [serial_string ()])
 | 
| 68344 | 365  | 
    {delay = NONE, pri = pri, persistent = true, strict = true, print_fn = print_fn};
 | 
| 68334 | 366  | 
|
| 58923 | 367  | 
fun print command_visible command_overlays keywords command_name eval old_prints =  | 
| 52570 | 368  | 
let  | 
| 
52850
 
9fff9f78240a
support print functions with explicit arguments, as provided by overlays;
 
wenzelm 
parents: 
52785 
diff
changeset
 | 
369  | 
val print_functions = Synchronized.value print_functions;  | 
| 
 
9fff9f78240a
support print functions with explicit arguments, as provided by overlays;
 
wenzelm 
parents: 
52785 
diff
changeset
 | 
370  | 
|
| 68333 | 371  | 
fun new_print (name, args) get_pr =  | 
| 52570 | 372  | 
let  | 
| 58923 | 373  | 
val params =  | 
374  | 
         {keywords = keywords,
 | 
|
375  | 
command_name = command_name,  | 
|
376  | 
args = args,  | 
|
377  | 
exec_id = eval_exec_id eval};  | 
|
| 52570 | 378  | 
in  | 
| 
56303
 
4cc3f4db3447
clarified Isabelle/ML bootstrap, such that Execution does not require ML_Compiler;
 
wenzelm 
parents: 
56292 
diff
changeset
 | 
379  | 
(case Exn.capture (Runtime.controlled_execution NONE get_pr) params of  | 
| 52570 | 380  | 
Exn.Res NONE => NONE  | 
| 68333 | 381  | 
| Exn.Res (SOME pr) => SOME (make_print (name, args) pr eval)  | 
382  | 
| Exn.Exn exn => SOME (bad_print (name, args) exn eval))  | 
|
| 52570 | 383  | 
end;  | 
384  | 
||
| 68333 | 385  | 
fun get_print (name, args) =  | 
386  | 
(case find_first (fn Print print => (#name print, #args print) = (name, args)) old_prints of  | 
|
| 
52850
 
9fff9f78240a
support print functions with explicit arguments, as provided by overlays;
 
wenzelm 
parents: 
52785 
diff
changeset
 | 
387  | 
NONE =>  | 
| 68333 | 388  | 
(case AList.lookup (op =) print_functions name of  | 
389  | 
NONE =>  | 
|
390  | 
              SOME (bad_print (name, args) (ERROR ("Missing print function " ^ quote name)) eval)
 | 
|
391  | 
| 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
 | 
392  | 
| some => some);  | 
| 
 
9fff9f78240a
support print functions with explicit arguments, as provided by overlays;
 
wenzelm 
parents: 
52785 
diff
changeset
 | 
393  | 
|
| 68334 | 394  | 
val retained_prints =  | 
395  | 
filter (fn print => print_finished print andalso print_persistent print) old_prints;  | 
|
396  | 
val visible_prints =  | 
|
| 52570 | 397  | 
if command_visible then  | 
| 68333 | 398  | 
fold (fn (name, _) => cons (name, [])) print_functions command_overlays  | 
| 
52853
 
4ab66773a41f
prefer canonical order, to avoid potential fluctuation due to front-end edits;
 
wenzelm 
parents: 
52850 
diff
changeset
 | 
399  | 
|> sort_distinct overlay_ord  | 
| 
52850
 
9fff9f78240a
support print functions with explicit arguments, as provided by overlays;
 
wenzelm 
parents: 
52785 
diff
changeset
 | 
400  | 
|> map_filter get_print  | 
| 68334 | 401  | 
else [];  | 
402  | 
val new_prints = visible_prints @ retained_prints;  | 
|
| 52570 | 403  | 
in  | 
| 52600 | 404  | 
if eq_list print_eq (old_prints, new_prints) then NONE else SOME new_prints  | 
| 52570 | 405  | 
end;  | 
| 52511 | 406  | 
|
| 
68366
 
cd387c55e085
fork parallel prints early in execution: avoid degradation of priority due to main eval task;
 
wenzelm 
parents: 
68344 
diff
changeset
 | 
407  | 
fun parallel_print (Print {pri, ...}) =
 | 
| 
 
cd387c55e085
fork parallel prints early in execution: avoid degradation of priority due to main eval task;
 
wenzelm 
parents: 
68344 
diff
changeset
 | 
408  | 
pri <= 0 orelse (Future.enabled () andalso Options.default_bool "parallel_print");  | 
| 
 
cd387c55e085
fork parallel prints early in execution: avoid degradation of priority due to main eval task;
 
wenzelm 
parents: 
68344 
diff
changeset
 | 
409  | 
|
| 
52647
 
45ce95b8bf69
determine print function parameters dynamically, e.g. depending on runtime options;
 
wenzelm 
parents: 
52619 
diff
changeset
 | 
410  | 
fun print_function name f =  | 
| 52511 | 411  | 
Synchronized.change print_functions (fn funs =>  | 
| 68334 | 412  | 
(if name = "" then error "Unnamed print function" else ();  | 
413  | 
if not (AList.defined (op =) funs name) then ()  | 
|
| 52511 | 414  | 
    else warning ("Redefining command print function: " ^ quote name);
 | 
| 
52647
 
45ce95b8bf69
determine print function parameters dynamically, e.g. depending on runtime options;
 
wenzelm 
parents: 
52619 
diff
changeset
 | 
415  | 
AList.update (op =) (name, f) funs));  | 
| 52511 | 416  | 
|
| 52571 | 417  | 
fun no_print_function name =  | 
418  | 
Synchronized.change print_functions (filter_out (equal name o #1));  | 
|
419  | 
||
| 52511 | 420  | 
end;  | 
421  | 
||
| 52526 | 422  | 
val _ =  | 
| 
56291
 
e79f76a48449
added Execution.print: accumulate print operations for some command execution, which are applied later and print time;
 
wenzelm 
parents: 
56265 
diff
changeset
 | 
423  | 
print_function "Execution.print"  | 
| 
 
e79f76a48449
added Execution.print: accumulate print operations for some command execution, which are applied later and print time;
 
wenzelm 
parents: 
56265 
diff
changeset
 | 
424  | 
    (fn {args, exec_id, ...} =>
 | 
| 
 
e79f76a48449
added Execution.print: accumulate print operations for some command execution, which are applied later and print time;
 
wenzelm 
parents: 
56265 
diff
changeset
 | 
425  | 
if null args then  | 
| 
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: 
60095 
diff
changeset
 | 
426  | 
        SOME {delay = NONE, pri = Task_Queue.urgent_pri + 2, persistent = false, strict = false,
 | 
| 56292 | 427  | 
print_fn = fn _ => fn _ => Execution.fork_prints exec_id}  | 
| 
56291
 
e79f76a48449
added Execution.print: accumulate print operations for some command execution, which are applied later and print time;
 
wenzelm 
parents: 
56265 
diff
changeset
 | 
428  | 
else NONE);  | 
| 
 
e79f76a48449
added Execution.print: accumulate print operations for some command execution, which are applied later and print time;
 
wenzelm 
parents: 
56265 
diff
changeset
 | 
429  | 
|
| 
 
e79f76a48449
added Execution.print: accumulate print operations for some command execution, which are applied later and print time;
 
wenzelm 
parents: 
56265 
diff
changeset
 | 
430  | 
val _ =  | 
| 
52647
 
45ce95b8bf69
determine print function parameters dynamically, e.g. depending on runtime options;
 
wenzelm 
parents: 
52619 
diff
changeset
 | 
431  | 
print_function "print_state"  | 
| 58923 | 432  | 
    (fn {keywords, command_name, ...} =>
 | 
| 61213 | 433  | 
if Options.default_bool "editor_output_state" andalso Keyword.is_printed keywords command_name  | 
434  | 
then  | 
|
| 
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: 
60095 
diff
changeset
 | 
435  | 
        SOME {delay = NONE, pri = Task_Queue.urgent_pri + 1, persistent = false, strict = false,
 | 
| 61208 | 436  | 
print_fn = fn _ => fn st =>  | 
437  | 
if Toplevel.is_proof st then Output.state (Toplevel.string_of_state st)  | 
|
438  | 
else ()}  | 
|
| 
56895
 
f058120aaad4
discontinued Toplevel.print flag -- print uniformly according to Keyword.is_printed;
 
wenzelm 
parents: 
56887 
diff
changeset
 | 
439  | 
else NONE);  | 
| 52509 | 440  | 
|
| 52532 | 441  | 
|
| 52600 | 442  | 
(* combined execution *)  | 
443  | 
||
444  | 
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
 | 
445  | 
|
| 
 
54c2abe7e9a4
treat ROOT.ML as theory with header "theory ML_Root imports ML_Bootstrap begin";
 
wenzelm 
parents: 
62826 
diff
changeset
 | 
446  | 
fun init_exec opt_thy : exec =  | 
| 
68184
 
6c693b2700b3
support for dynamic document output while editing;
 
wenzelm 
parents: 
68130 
diff
changeset
 | 
447  | 
(Eval  | 
| 
 
6c693b2700b3
support for dynamic document output while editing;
 
wenzelm 
parents: 
68130 
diff
changeset
 | 
448  | 
    {command_id = Document_ID.none, exec_id = Document_ID.none,
 | 
| 
 
6c693b2700b3
support for dynamic document output while editing;
 
wenzelm 
parents: 
68130 
diff
changeset
 | 
449  | 
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
 | 
450  | 
|
| 
 
54c2abe7e9a4
treat ROOT.ML as theory with header "theory ML_Root imports ML_Bootstrap begin";
 
wenzelm 
parents: 
62826 
diff
changeset
 | 
451  | 
val no_exec = init_exec NONE;  | 
| 52532 | 452  | 
|
| 52600 | 453  | 
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
 | 
454  | 
| exec_ids (SOME (eval, prints)) = eval_exec_id eval :: map print_exec_id prints;  | 
| 52600 | 455  | 
|
456  | 
local  | 
|
457  | 
||
| 
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
 | 
458  | 
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
 | 
459  | 
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
 | 
460  | 
if Execution.running execution_id exec_id [group] then  | 
| 68931 | 461  | 
      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
 | 
462  | 
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
 | 
463  | 
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
 | 
464  | 
|
| 
59328
 
b83d6c3c439a
ignore print process even after fork, to avoid loosing active worker threads;
 
wenzelm 
parents: 
59193 
diff
changeset
 | 
465  | 
fun ignore_process process =  | 
| 
 
b83d6c3c439a
ignore print process even after fork, to avoid loosing active worker threads;
 
wenzelm 
parents: 
59193 
diff
changeset
 | 
466  | 
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
 | 
467  | 
|
| 
68184
 
6c693b2700b3
support for dynamic document output while editing;
 
wenzelm 
parents: 
68130 
diff
changeset
 | 
468  | 
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
 | 
469  | 
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
 | 
470  | 
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
 | 
471  | 
|
| 
68366
 
cd387c55e085
fork parallel prints early in execution: avoid degradation of priority due to main eval task;
 
wenzelm 
parents: 
68344 
diff
changeset
 | 
472  | 
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
 | 
473  | 
let  | 
| 
 
cd387c55e085
fork parallel prints early in execution: avoid degradation of priority due to main eval task;
 
wenzelm 
parents: 
68344 
diff
changeset
 | 
474  | 
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
 | 
475  | 
fun fork () =  | 
| 
 
cd387c55e085
fork parallel prints early in execution: avoid degradation of priority due to main eval task;
 
wenzelm 
parents: 
68344 
diff
changeset
 | 
476  | 
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
 | 
477  | 
        {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
 | 
478  | 
(fn () =>  | 
| 
 
cd387c55e085
fork parallel prints early in execution: avoid degradation of priority due to main eval task;
 
wenzelm 
parents: 
68344 
diff
changeset
 | 
479  | 
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
 | 
480  | 
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
 | 
481  | 
in  | 
| 
 
cd387c55e085
fork parallel prints early in execution: avoid degradation of priority due to main eval task;
 
wenzelm 
parents: 
68344 
diff
changeset
 | 
482  | 
(case delay of  | 
| 
 
cd387c55e085
fork parallel prints early in execution: avoid degradation of priority due to main eval task;
 
wenzelm 
parents: 
68344 
diff
changeset
 | 
483  | 
NONE => fork ()  | 
| 
69826
 
1bea05713dde
physical vs. logical events, the latter takes GC time into account;
 
wenzelm 
parents: 
69506 
diff
changeset
 | 
484  | 
    | 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
 | 
485  | 
end;  | 
| 
 
cd387c55e085
fork parallel prints early in execution: avoid degradation of priority due to main eval task;
 
wenzelm 
parents: 
68344 
diff
changeset
 | 
486  | 
|
| 
 
cd387c55e085
fork parallel prints early in execution: avoid degradation of priority due to main eval task;
 
wenzelm 
parents: 
68344 
diff
changeset
 | 
487  | 
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
 | 
488  | 
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
 | 
489  | 
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
 | 
490  | 
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
 | 
491  | 
|
| 52600 | 492  | 
in  | 
493  | 
||
| 
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
 | 
494  | 
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
 | 
495  | 
(run_eval execution_id eval; List.app (run_print execution_id) prints);  | 
| 52532 | 496  | 
|
| 
68366
 
cd387c55e085
fork parallel prints early in execution: avoid degradation of priority due to main eval task;
 
wenzelm 
parents: 
68344 
diff
changeset
 | 
497  | 
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
 | 
498  | 
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
 | 
499  | 
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
 | 
500  | 
else SOME exec;  | 
| 
 
cd387c55e085
fork parallel prints early in execution: avoid degradation of priority due to main eval task;
 
wenzelm 
parents: 
68344 
diff
changeset
 | 
501  | 
|
| 47336 | 502  | 
end;  | 
503  | 
||
| 52600 | 504  | 
end;  |