author | wenzelm |
Thu, 20 Dec 2007 21:12:01 +0100 | |
changeset 25734 | b00b903ae8ae |
parent 25118 | 158149a6e95b |
child 25798 | 1e6eafbb466f |
permissions | -rw-r--r-- |
23827 | 1 |
(* Title: Pure/General/print_mode.ML |
2 |
ID: $Id$ |
|
3 |
Author: Makarius |
|
4 |
||
25734
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
5 |
Generic print mode as thread-local value derived from global template; |
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
6 |
provides implicit configuration for various output mechanisms. |
23827 | 7 |
*) |
8 |
||
23934 | 9 |
signature BASIC_PRINT_MODE = |
23827 | 10 |
sig |
25734
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
11 |
val print_mode: string list ref (*global template*) |
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
12 |
val print_mode_value: unit -> string list (*thread-local value*) |
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
13 |
val print_mode_active: string -> bool (*thread-local value*) |
23827 | 14 |
end; |
15 |
||
23934 | 16 |
signature PRINT_MODE = |
17 |
sig |
|
18 |
include BASIC_PRINT_MODE |
|
25118
158149a6e95b
added input/internal, which are never active in print_mode_value;
wenzelm
parents:
24634
diff
changeset
|
19 |
val input: string |
158149a6e95b
added input/internal, which are never active in print_mode_value;
wenzelm
parents:
24634
diff
changeset
|
20 |
val internal: string |
24634 | 21 |
val setmp: string list -> ('a -> 'b) -> 'a -> 'b |
23934 | 22 |
val with_modes: string list -> ('a -> 'b) -> 'a -> 'b |
25734
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
23 |
val closure: ('a -> 'b) -> 'a -> 'b |
23934 | 24 |
end; |
25 |
||
23827 | 26 |
structure PrintMode: PRINT_MODE = |
27 |
struct |
|
28 |
||
25118
158149a6e95b
added input/internal, which are never active in print_mode_value;
wenzelm
parents:
24634
diff
changeset
|
29 |
val input = "input"; |
158149a6e95b
added input/internal, which are never active in print_mode_value;
wenzelm
parents:
24634
diff
changeset
|
30 |
val internal = "internal"; |
24613 | 31 |
|
25118
158149a6e95b
added input/internal, which are never active in print_mode_value;
wenzelm
parents:
24634
diff
changeset
|
32 |
val print_mode = ref ([]: string list); |
25734
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
33 |
val tag = Universal.tag () : string list option Universal.tag; |
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
34 |
|
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
35 |
fun print_mode_value () = |
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
36 |
let val modes = |
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
37 |
(case Multithreading.get_data tag of |
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
38 |
SOME (SOME modes) => modes |
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
39 |
| _ => NAMED_CRITICAL "print_mode" (fn () => ! print_mode)) |
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
40 |
in subtract (op =) [input, internal] modes end; |
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
41 |
|
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
42 |
fun print_mode_active mode = member (op =) (print_mode_value ()) mode; |
25118
158149a6e95b
added input/internal, which are never active in print_mode_value;
wenzelm
parents:
24634
diff
changeset
|
43 |
|
25734
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
44 |
fun setmp modes f x = |
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
45 |
let |
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
46 |
val orig_data = |
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
47 |
(case Multithreading.get_data tag of |
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
48 |
SOME (SOME orig_modes) => SOME orig_modes |
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
49 |
| _ => NONE); |
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
50 |
val _ = Multithreading.put_data (tag, SOME modes); |
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
51 |
val result = Exn.capture f x; |
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
52 |
val _ = Multithreading.put_data (tag, orig_data); |
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
53 |
in Exn.release result end; |
23827 | 54 |
|
25734
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
55 |
fun with_modes modes f x = setmp (modes @ print_mode_value ()) f x; |
b00b903ae8ae
separated into global template vs. thread-local value;
wenzelm
parents:
25118
diff
changeset
|
56 |
fun closure f = with_modes [] f; |
23934 | 57 |
|
23827 | 58 |
end; |
59 |
||
23934 | 60 |
structure BasicPrintMode: BASIC_PRINT_MODE = PrintMode; |
61 |
open BasicPrintMode; |