author | wenzelm |
Tue, 06 Aug 2013 22:02:20 +0200 | |
changeset 52879 | 1df5280f8713 |
parent 52876 | 78989972d5b8 |
child 52929 | 52d21bddcb8a |
permissions | -rw-r--r-- |
52865
02a7e7180ee5
slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff
changeset
|
1 |
(* Title: Pure/PIDE/query_operation.ML |
02a7e7180ee5
slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff
changeset
|
2 |
Author: Makarius |
02a7e7180ee5
slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff
changeset
|
3 |
|
02a7e7180ee5
slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff
changeset
|
4 |
One-shot query operations via asynchronous print functions and temporary |
02a7e7180ee5
slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff
changeset
|
5 |
document overlay. |
02a7e7180ee5
slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff
changeset
|
6 |
*) |
02a7e7180ee5
slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff
changeset
|
7 |
|
02a7e7180ee5
slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff
changeset
|
8 |
signature QUERY_OPERATION = |
02a7e7180ee5
slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff
changeset
|
9 |
sig |
52879
1df5280f8713
support for query operations that consist of parallel segments;
wenzelm
parents:
52876
diff
changeset
|
10 |
val register_parallel: string -> (Toplevel.state -> string list -> (unit -> string) list) -> unit |
52865
02a7e7180ee5
slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff
changeset
|
11 |
val register: string -> (Toplevel.state -> string list -> string) -> unit |
02a7e7180ee5
slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff
changeset
|
12 |
end; |
02a7e7180ee5
slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff
changeset
|
13 |
|
02a7e7180ee5
slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff
changeset
|
14 |
structure Query_Operation: QUERY_OPERATION = |
02a7e7180ee5
slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff
changeset
|
15 |
struct |
02a7e7180ee5
slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff
changeset
|
16 |
|
52879
1df5280f8713
support for query operations that consist of parallel segments;
wenzelm
parents:
52876
diff
changeset
|
17 |
fun register_parallel name f = |
52865
02a7e7180ee5
slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff
changeset
|
18 |
Command.print_function name |
02a7e7180ee5
slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff
changeset
|
19 |
(fn {args = instance :: args, ...} => |
02a7e7180ee5
slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff
changeset
|
20 |
SOME {delay = NONE, pri = 0, persistent = false, |
02a7e7180ee5
slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff
changeset
|
21 |
print_fn = fn _ => fn state => |
02a7e7180ee5
slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff
changeset
|
22 |
let |
52876 | 23 |
fun result s = Output.result [(Markup.instanceN, instance)] s; |
24 |
fun status m = result (Markup.markup_only m); |
|
52879
1df5280f8713
support for query operations that consist of parallel segments;
wenzelm
parents:
52876
diff
changeset
|
25 |
fun error_msg exn = |
1df5280f8713
support for query operations that consist of parallel segments;
wenzelm
parents:
52876
diff
changeset
|
26 |
if Exn.is_interrupt exn then reraise exn |
1df5280f8713
support for query operations that consist of parallel segments;
wenzelm
parents:
52876
diff
changeset
|
27 |
else |
1df5280f8713
support for query operations that consist of parallel segments;
wenzelm
parents:
52876
diff
changeset
|
28 |
XML.Elem ((Markup.errorN, []), [XML.Text (ML_Compiler.exn_message exn)]) |
1df5280f8713
support for query operations that consist of parallel segments;
wenzelm
parents:
52876
diff
changeset
|
29 |
|> YXML.string_of |> result; |
52876 | 30 |
|
31 |
val _ = status Markup.running; |
|
52879
1df5280f8713
support for query operations that consist of parallel segments;
wenzelm
parents:
52876
diff
changeset
|
32 |
val outputs = f state args handle exn => (error_msg exn; []); |
1df5280f8713
support for query operations that consist of parallel segments;
wenzelm
parents:
52876
diff
changeset
|
33 |
val _ = outputs |> Par_List.map (fn out => |
1df5280f8713
support for query operations that consist of parallel segments;
wenzelm
parents:
52876
diff
changeset
|
34 |
(case Exn.capture out () of |
1df5280f8713
support for query operations that consist of parallel segments;
wenzelm
parents:
52876
diff
changeset
|
35 |
Exn.Res s => |
1df5280f8713
support for query operations that consist of parallel segments;
wenzelm
parents:
52876
diff
changeset
|
36 |
result (YXML.string_of (XML.Elem ((Markup.writelnN, []), [XML.Text s]))) |
1df5280f8713
support for query operations that consist of parallel segments;
wenzelm
parents:
52876
diff
changeset
|
37 |
| Exn.Exn exn => error_msg exn)); |
52876 | 38 |
val _ = status Markup.finished; |
39 |
in () end} |
|
52865
02a7e7180ee5
slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff
changeset
|
40 |
| _ => NONE); |
02a7e7180ee5
slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff
changeset
|
41 |
|
52879
1df5280f8713
support for query operations that consist of parallel segments;
wenzelm
parents:
52876
diff
changeset
|
42 |
fun register name f = |
1df5280f8713
support for query operations that consist of parallel segments;
wenzelm
parents:
52876
diff
changeset
|
43 |
register_parallel name (fn st => fn args => [fn () => f st args]); |
1df5280f8713
support for query operations that consist of parallel segments;
wenzelm
parents:
52876
diff
changeset
|
44 |
|
52865
02a7e7180ee5
slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff
changeset
|
45 |
end; |
02a7e7180ee5
slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff
changeset
|
46 |