| author | wenzelm | 
| Tue, 12 Aug 2008 21:28:09 +0200 | |
| changeset 27845 | 141772c866c9 | 
| parent 25798 | 1e6eafbb466f | 
| child 28122 | 3d099ce624e7 | 
| 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: 
25118diff
changeset | 5 | Generic print mode as thread-local value derived from global template; | 
| 
b00b903ae8ae
separated into global template vs. thread-local value;
 wenzelm parents: 
25118diff
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: 
25118diff
changeset | 11 | val print_mode: string list ref (*global template*) | 
| 
b00b903ae8ae
separated into global template vs. thread-local value;
 wenzelm parents: 
25118diff
changeset | 12 | val print_mode_value: unit -> string list (*thread-local value*) | 
| 
b00b903ae8ae
separated into global template vs. thread-local value;
 wenzelm parents: 
25118diff
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: 
24634diff
changeset | 19 | val input: string | 
| 
158149a6e95b
added input/internal, which are never active in print_mode_value;
 wenzelm parents: 
24634diff
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: 
25118diff
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: 
24634diff
changeset | 29 | val input = "input"; | 
| 
158149a6e95b
added input/internal, which are never active in print_mode_value;
 wenzelm parents: 
24634diff
changeset | 30 | val internal = "internal"; | 
| 24613 | 31 | |
| 25118 
158149a6e95b
added input/internal, which are never active in print_mode_value;
 wenzelm parents: 
24634diff
changeset | 32 | val print_mode = ref ([]: string list); | 
| 25734 
b00b903ae8ae
separated into global template vs. thread-local value;
 wenzelm parents: 
25118diff
changeset | 33 | val tag = Universal.tag () : string list option Universal.tag; | 
| 
b00b903ae8ae
separated into global template vs. thread-local value;
 wenzelm parents: 
25118diff
changeset | 34 | |
| 
b00b903ae8ae
separated into global template vs. thread-local value;
 wenzelm parents: 
25118diff
changeset | 35 | fun print_mode_value () = | 
| 
b00b903ae8ae
separated into global template vs. thread-local value;
 wenzelm parents: 
25118diff
changeset | 36 | let val modes = | 
| 
b00b903ae8ae
separated into global template vs. thread-local value;
 wenzelm parents: 
25118diff
changeset | 37 | (case Multithreading.get_data tag of | 
| 
b00b903ae8ae
separated into global template vs. thread-local value;
 wenzelm parents: 
25118diff
changeset | 38 | SOME (SOME modes) => modes | 
| 
b00b903ae8ae
separated into global template vs. thread-local value;
 wenzelm parents: 
25118diff
changeset | 39 | | _ => NAMED_CRITICAL "print_mode" (fn () => ! print_mode)) | 
| 
b00b903ae8ae
separated into global template vs. thread-local value;
 wenzelm parents: 
25118diff
changeset | 40 | in subtract (op =) [input, internal] modes end; | 
| 
b00b903ae8ae
separated into global template vs. thread-local value;
 wenzelm parents: 
25118diff
changeset | 41 | |
| 
b00b903ae8ae
separated into global template vs. thread-local value;
 wenzelm parents: 
25118diff
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: 
24634diff
changeset | 43 | |
| 25734 
b00b903ae8ae
separated into global template vs. thread-local value;
 wenzelm parents: 
25118diff
changeset | 44 | fun setmp modes f x = | 
| 25798 | 45 | let val orig_modes = (case Multithreading.get_data tag of SOME (SOME ms) => SOME ms | _ => NONE) | 
| 46 | in setmp_thread_data tag orig_modes (SOME modes) f x end; | |
| 23827 | 47 | |
| 25734 
b00b903ae8ae
separated into global template vs. thread-local value;
 wenzelm parents: 
25118diff
changeset | 48 | fun with_modes modes f x = setmp (modes @ print_mode_value ()) f x; | 
| 
b00b903ae8ae
separated into global template vs. thread-local value;
 wenzelm parents: 
25118diff
changeset | 49 | fun closure f = with_modes [] f; | 
| 23934 | 50 | |
| 23827 | 51 | end; | 
| 52 | ||
| 23934 | 53 | structure BasicPrintMode: BASIC_PRINT_MODE = PrintMode; | 
| 54 | open BasicPrintMode; |