17 |
17 |
18 fun register {name, pri} f = |
18 fun register {name, pri} f = |
19 Command.print_function (name ^ "_query") |
19 Command.print_function (name ^ "_query") |
20 (fn {args = instance :: args, ...} => |
20 (fn {args = instance :: args, ...} => |
21 SOME {delay = NONE, pri = pri, persistent = false, strict = false, |
21 SOME {delay = NONE, pri = pri, persistent = false, strict = false, |
22 print_fn = fn _ => Thread_Attributes.uninterruptible (fn restore_attributes => fn state => |
22 print_fn = fn _ => Thread_Attributes.uninterruptible (fn run => fn state => |
23 let |
23 let |
24 fun output_result s = Output.result [(Markup.instanceN, instance)] [s]; |
24 fun output_result s = Output.result [(Markup.instanceN, instance)] [s]; |
25 fun status m = output_result (Markup.markup_only m); |
25 fun status m = output_result (Markup.markup_only m); |
26 fun writeln_result s = output_result (Markup.markup Markup.writeln s); |
26 fun writeln_result s = output_result (Markup.markup Markup.writeln s); |
27 fun toplevel_error exn = |
27 fun toplevel_error exn = |
28 output_result (Markup.markup Markup.error (Runtime.exn_message exn)); |
28 output_result (Markup.markup Markup.error (Runtime.exn_message exn)); |
29 |
29 |
30 val _ = status Markup.running; |
30 val _ = status Markup.running; |
31 fun run () = |
31 fun main () = |
32 f {state = state, args = args, output_result = output_result, |
32 f {state = state, args = args, output_result = output_result, |
33 writeln_result = writeln_result}; |
33 writeln_result = writeln_result}; |
34 val _ = |
34 val _ = |
35 (case Exn.capture (*sic!*) (restore_attributes run) () of |
35 (case Exn.capture (*sic!*) (run main) () of |
36 Exn.Res () => () |
36 Exn.Res () => () |
37 | Exn.Exn exn => toplevel_error exn); |
37 | Exn.Exn exn => toplevel_error exn); |
38 val _ = status Markup.finished; |
38 val _ = status Markup.finished; |
39 in () end)} |
39 in () end)} |
40 | _ => NONE); |
40 | _ => NONE); |