| author | blanchet | 
| Tue, 01 Jul 2014 16:49:25 +0200 | |
| changeset 57470 | 9512b867259c | 
| parent 56627 | cb912b7de3cf | 
| child 59055 | 5a7157b8e870 | 
| permissions | -rw-r--r-- | 
| 4403 | 1 | (* Title: Pure/ML-Systems/smlnj.ML | 
| 2 | ||
| 50910 | 3 | Compatibility file for Standard ML of New Jersey. | 
| 4403 | 4 | *) | 
| 5 | ||
| 54342 
fbcaa9f08879
avoid non-portable int constant -- make SML/NJ happy;
 wenzelm parents: 
53709diff
changeset | 6 | val io_buffer_size = 4096; | 
| 44249 
64620f1d6f87
identify parallel exceptions where they emerge first -- to achieve unique results within evaluation graph;
 wenzelm parents: 
43948diff
changeset | 7 | use "ML-Systems/proper_int.ML"; | 
| 
64620f1d6f87
identify parallel exceptions where they emerge first -- to achieve unique results within evaluation graph;
 wenzelm parents: 
43948diff
changeset | 8 | |
| 28443 | 9 | exception Interrupt; | 
| 31427 
5a07cc86675d
reraise exceptions to preserve original position (ML system specific);
 wenzelm parents: 
31321diff
changeset | 10 | fun reraise exn = raise exn; | 
| 28443 | 11 | |
| 56627 | 12 | fun exit rc = Posix.Process.exit (Word8.fromInt rc); | 
| 13 | fun quit () = exit 0; | |
| 14 | ||
| 24599 
7b0ecf9a9055
use_text/file: tune text (cf. ML_Parse.fix_ints);
 wenzelm parents: 
24329diff
changeset | 15 | use "ML-Systems/overloading_smlnj.ML"; | 
| 34136 | 16 | use "General/exn.ML"; | 
| 35014 
a725ff6ead26
explicit representation of single-assignment variables;
 wenzelm parents: 
35010diff
changeset | 17 | use "ML-Systems/single_assignment.ML"; | 
| 25732 | 18 | use "ML-Systems/universal.ML"; | 
| 28151 
61f9c918b410
explicit use of universal.ML and dummy_thread.ML;
 wenzelm parents: 
26885diff
changeset | 19 | use "ML-Systems/thread_dummy.ML"; | 
| 24688 
a5754ca5c510
replaced interrupt_timeout by TimeLimit.timeLimit (available on SML/NJ and Poly/ML 5.1);
 wenzelm parents: 
24599diff
changeset | 20 | use "ML-Systems/multithreading.ML"; | 
| 28268 
ac8431ecd57e
use_text/use_file now depend on explicit ML name space;
 wenzelm parents: 
28151diff
changeset | 21 | use "ML-Systems/ml_name_space.ML"; | 
| 30619 | 22 | use "ML-Systems/ml_pretty.ML"; | 
| 38635 
f76ad0771f67
added ML toplevel pretty-printing for tables, using dummy for anything other than Poly/ML 5.3.0 (or later);
 wenzelm parents: 
36162diff
changeset | 23 | structure PolyML = struct end; | 
| 
f76ad0771f67
added ML toplevel pretty-printing for tables, using dummy for anything other than Poly/ML 5.3.0 (or later);
 wenzelm parents: 
36162diff
changeset | 24 | use "ML-Systems/pp_dummy.ML"; | 
| 30672 
beaadd5af500
more systematic type use_context, with particular values ML_Parse.global_context and ML_Context.local_context;
 wenzelm parents: 
30626diff
changeset | 25 | use "ML-Systems/use_context.ML"; | 
| 56435 
28b34e8e4a80
approximate ML antiquotation @{here} for Isabelle/Pure bootstrap;
 wenzelm parents: 
56285diff
changeset | 26 | use "ML-Systems/ml_positions.ML"; | 
| 23921 
947152add153
added compatibility file for ML systems without multithreading;
 wenzelm parents: 
23826diff
changeset | 27 | |
| 16542 | 28 | |
| 42012 
2c3fe3cbebae
structure Timing: covers former start_timing/end_timing and Output.timeit etc;
 wenzelm parents: 
41411diff
changeset | 29 | val seconds = Time.fromReal; | 
| 
2c3fe3cbebae
structure Timing: covers former start_timing/end_timing and Output.timeit etc;
 wenzelm parents: 
41411diff
changeset | 30 | |
| 16542 | 31 | (*low-level pointer equality*) | 
| 21298 
6d2306b2376d
tuned names of start_timing,/end_timing/check_timer;
 wenzelm parents: 
18790diff
changeset | 32 | CM.autoload "$smlnj/init/init.cmi"; | 
| 
6d2306b2376d
tuned names of start_timing,/end_timing/check_timer;
 wenzelm parents: 
18790diff
changeset | 33 | val pointer_eq = InlineT.ptreql; | 
| 16528 | 34 | |
| 16502 | 35 | |
| 4403 | 36 | (* restore old-style character / string functions *) | 
| 37 | ||
| 40627 
becf5d5187cc
renamed raw "explode" function to "raw_explode" to emphasize its meaning;
 wenzelm parents: 
40393diff
changeset | 38 | val ord = mk_int o SML90.ord; | 
| 
becf5d5187cc
renamed raw "explode" function to "raw_explode" to emphasize its meaning;
 wenzelm parents: 
40393diff
changeset | 39 | val chr = SML90.chr o dest_int; | 
| 
becf5d5187cc
renamed raw "explode" function to "raw_explode" to emphasize its meaning;
 wenzelm parents: 
40393diff
changeset | 40 | val raw_explode = SML90.explode; | 
| 10725 | 41 | val implode = SML90.implode; | 
| 4403 | 42 | |
| 43 | ||
| 44 | (* New Jersey ML parameters *) | |
| 45 | ||
| 46 | val _ = | |
| 21298 
6d2306b2376d
tuned names of start_timing,/end_timing/check_timer;
 wenzelm parents: 
18790diff
changeset | 47 | (Control.Print.printLength := 1000; | 
| 
6d2306b2376d
tuned names of start_timing,/end_timing/check_timer;
 wenzelm parents: 
18790diff
changeset | 48 | Control.Print.printDepth := 350; | 
| 
6d2306b2376d
tuned names of start_timing,/end_timing/check_timer;
 wenzelm parents: 
18790diff
changeset | 49 | Control.Print.stringDepth := 250; | 
| 
6d2306b2376d
tuned names of start_timing,/end_timing/check_timer;
 wenzelm parents: 
18790diff
changeset | 50 | Control.Print.signatures := 2; | 
| 
6d2306b2376d
tuned names of start_timing,/end_timing/check_timer;
 wenzelm parents: 
18790diff
changeset | 51 | Control.MC.matchRedundantError := false); | 
| 4403 | 52 | |
| 53 | ||
| 54 | (* Poly/ML emulation *) | |
| 55 | ||
| 56 | (*limit the printing depth -- divided by 2 for comparibility with Poly/ML*) | |
| 24329 | 57 | local | 
| 24599 
7b0ecf9a9055
use_text/file: tune text (cf. ML_Parse.fix_ints);
 wenzelm parents: 
24329diff
changeset | 58 | val depth = ref (10: int); | 
| 24329 | 59 | in | 
| 56281 | 60 | fun get_default_print_depth () = ! depth; | 
| 56285 | 61 | fun default_print_depth n = | 
| 24329 | 62 | (depth := n; | 
| 63 | Control.Print.printDepth := dest_int n div 2; | |
| 64 | Control.Print.printLength := dest_int n); | |
| 56285 | 65 | val _ = default_print_depth 10; | 
| 24329 | 66 | end; | 
| 4403 | 67 | |
| 36162 
0bd034a80a9a
added ML antiquotation @{make_string}, which produces proper pretty printed version in Poly/ML 5.3.0 or later;
 wenzelm parents: 
35014diff
changeset | 68 | val ml_make_string = "(fn _ => \"?\")"; | 
| 
0bd034a80a9a
added ML antiquotation @{make_string}, which produces proper pretty printed version in Poly/ML 5.3.0 or later;
 wenzelm parents: 
35014diff
changeset | 69 | |
| 26474 | 70 | |
| 16660 | 71 | (*prompts*) | 
| 4977 | 72 | fun ml_prompts p1 p2 = | 
| 21298 
6d2306b2376d
tuned names of start_timing,/end_timing/check_timer;
 wenzelm parents: 
18790diff
changeset | 73 | (Control.primaryPrompt := p1; Control.secondaryPrompt := p2); | 
| 4977 | 74 | |
| 17511 | 75 | (*dummy implementation*) | 
| 16681 | 76 | fun profile (n: int) f x = f x; | 
| 77 | ||
| 17511 | 78 | (*dummy implementation*) | 
| 53709 
84522727f9d3
improved printing of exception trace in Poly/ML 5.5.1;
 wenzelm parents: 
50911diff
changeset | 79 | fun print_exception_trace (_: exn -> string) f = f (); | 
| 4977 | 80 | |
| 21298 
6d2306b2376d
tuned names of start_timing,/end_timing/check_timer;
 wenzelm parents: 
18790diff
changeset | 81 | |
| 4403 | 82 | (* ML command execution *) | 
| 83 | ||
| 30672 
beaadd5af500
more systematic type use_context, with particular values ML_Parse.global_context and ML_Context.local_context;
 wenzelm parents: 
30626diff
changeset | 84 | fun use_text ({tune_source, print, error, ...}: use_context) (line, name) verbose txt =
 | 
| 5090 | 85 | let | 
| 21298 
6d2306b2376d
tuned names of start_timing,/end_timing/check_timer;
 wenzelm parents: 
18790diff
changeset | 86 | val ref out_orig = Control.Print.out; | 
| 5090 | 87 | |
| 88 | val out_buffer = ref ([]: string list); | |
| 89 |     val out = {say = (fn s => out_buffer := s :: ! out_buffer), flush = (fn () => ())};
 | |
| 10914 | 90 | fun output () = | 
| 7890 | 91 | let val str = implode (rev (! out_buffer)) | 
| 10914 | 92 | in String.substring (str, 0, Int.max (0, size str - 1)) end; | 
| 5090 | 93 | in | 
| 21298 
6d2306b2376d
tuned names of start_timing,/end_timing/check_timer;
 wenzelm parents: 
18790diff
changeset | 94 | Control.Print.out := out; | 
| 56435 
28b34e8e4a80
approximate ML antiquotation @{here} for Isabelle/Pure bootstrap;
 wenzelm parents: 
56285diff
changeset | 95 | Backend.Interact.useStream (TextIO.openString (tune_source (ml_positions line name txt))) | 
| 
28b34e8e4a80
approximate ML antiquotation @{here} for Isabelle/Pure bootstrap;
 wenzelm parents: 
56285diff
changeset | 96 | handle exn => | 
| 
28b34e8e4a80
approximate ML antiquotation @{here} for Isabelle/Pure bootstrap;
 wenzelm parents: 
56285diff
changeset | 97 | (Control.Print.out := out_orig; | 
| 
28b34e8e4a80
approximate ML antiquotation @{here} for Isabelle/Pure bootstrap;
 wenzelm parents: 
56285diff
changeset | 98 | error ((if name = "" then "" else "Error in " ^ name ^ "\n") ^ output ()); raise exn); | 
| 21298 
6d2306b2376d
tuned names of start_timing,/end_timing/check_timer;
 wenzelm parents: 
18790diff
changeset | 99 | Control.Print.out := out_orig; | 
| 10914 | 100 | if verbose then print (output ()) else () | 
| 5090 | 101 | end; | 
| 4403 | 102 | |
| 30672 
beaadd5af500
more systematic type use_context, with particular values ML_Parse.global_context and ML_Context.local_context;
 wenzelm parents: 
30626diff
changeset | 103 | fun use_file context verbose name = | 
| 24599 
7b0ecf9a9055
use_text/file: tune text (cf. ML_Parse.fix_ints);
 wenzelm parents: 
24329diff
changeset | 104 | let | 
| 
7b0ecf9a9055
use_text/file: tune text (cf. ML_Parse.fix_ints);
 wenzelm parents: 
24329diff
changeset | 105 | val instream = TextIO.openIn name; | 
| 26504 | 106 | val txt = Exn.release (Exn.capture TextIO.inputAll instream before TextIO.closeIn instream); | 
| 30672 
beaadd5af500
more systematic type use_context, with particular values ML_Parse.global_context and ML_Context.local_context;
 wenzelm parents: 
30626diff
changeset | 107 | in use_text context (1, name) verbose txt end; | 
| 21770 | 108 | |
| 109 | ||
| 30626 | 110 | (* toplevel pretty printing *) | 
| 111 | ||
| 112 | fun ml_pprint pps = | |
| 113 | let | |
| 114 | fun str "" = () | |
| 115 | | str s = PrettyPrint.string pps s; | |
| 116 | fun pprint (ML_Pretty.Block ((bg, en), prts, ind)) = | |
| 117 | (str bg; PrettyPrint.openHOVBox pps (PrettyPrint.Rel (dest_int ind)); | |
| 118 | List.app pprint prts; PrettyPrint.closeBox pps; str en) | |
| 119 | | pprint (ML_Pretty.String (s, _)) = str s | |
| 120 |       | pprint (ML_Pretty.Break (false, wd)) = PrettyPrint.break pps {nsp = dest_int wd, offset = 0}
 | |
| 121 | | pprint (ML_Pretty.Break (true, _)) = PrettyPrint.newline pps; | |
| 122 | in pprint end; | |
| 123 | ||
| 30672 
beaadd5af500
more systematic type use_context, with particular values ML_Parse.global_context and ML_Context.local_context;
 wenzelm parents: 
30626diff
changeset | 124 | fun toplevel_pp context path pp = | 
| 
beaadd5af500
more systematic type use_context, with particular values ML_Parse.global_context and ML_Context.local_context;
 wenzelm parents: 
30626diff
changeset | 125 | use_text context (1, "pp") false | 
| 30626 | 126 |     ("CompilerPPTable.install_pp [" ^ String.concatWith "," (map (fn s => "\"" ^ s ^ "\"")  path) ^
 | 
| 127 |       "] (fn pps => ml_pprint pps o Pretty.to_ML o (" ^ pp ^ "))");
 | |
| 128 | ||
| 129 | ||
| 4403 | 130 | |
| 5816 | 131 | (** interrupts **) | 
| 132 | ||
| 26084 
a7475459c740
replaced ignore/raise_interrupt by more flexible (un)interruptible combinators;
 wenzelm parents: 
25732diff
changeset | 133 | local | 
| 
a7475459c740
replaced ignore/raise_interrupt by more flexible (un)interruptible combinators;
 wenzelm parents: 
25732diff
changeset | 134 | |
| 
a7475459c740
replaced ignore/raise_interrupt by more flexible (un)interruptible combinators;
 wenzelm parents: 
25732diff
changeset | 135 | fun change_signal new_handler f x = | 
| 5816 | 136 | let | 
| 26084 
a7475459c740
replaced ignore/raise_interrupt by more flexible (un)interruptible combinators;
 wenzelm parents: 
25732diff
changeset | 137 | val old_handler = Signals.setHandler (Signals.sigINT, new_handler); | 
| 
a7475459c740
replaced ignore/raise_interrupt by more flexible (un)interruptible combinators;
 wenzelm parents: 
25732diff
changeset | 138 | val result = Exn.capture (f old_handler) x; | 
| 12990 | 139 | val _ = Signals.setHandler (Signals.sigINT, old_handler); | 
| 23965 
f93e509659c1
ML-Systems/exn.ML, ML-Systems/multithreading_dummy.ML;
 wenzelm parents: 
23921diff
changeset | 140 | in Exn.release result end; | 
| 5816 | 141 | |
| 26084 
a7475459c740
replaced ignore/raise_interrupt by more flexible (un)interruptible combinators;
 wenzelm parents: 
25732diff
changeset | 142 | in | 
| 
a7475459c740
replaced ignore/raise_interrupt by more flexible (un)interruptible combinators;
 wenzelm parents: 
25732diff
changeset | 143 | |
| 
a7475459c740
replaced ignore/raise_interrupt by more flexible (un)interruptible combinators;
 wenzelm parents: 
25732diff
changeset | 144 | fun interruptible (f: 'a -> 'b) x = | 
| 12990 | 145 | let | 
| 39232 
69c6d3e87660
more abstract treatment of interrupts in structure Exn -- hardly ever need to mention Interrupt literally;
 wenzelm parents: 
38635diff
changeset | 146 | val result = ref (Exn.interrupt_exn: 'b Exn.result); | 
| 12990 | 147 | val old_handler = Signals.inqHandler Signals.sigINT; | 
| 5816 | 148 | in | 
| 12990 | 149 | SMLofNJ.Cont.callcc (fn cont => | 
| 26084 
a7475459c740
replaced ignore/raise_interrupt by more flexible (un)interruptible combinators;
 wenzelm parents: 
25732diff
changeset | 150 | (Signals.setHandler (Signals.sigINT, Signals.HANDLER (fn _ => cont)); | 
| 
a7475459c740
replaced ignore/raise_interrupt by more flexible (un)interruptible combinators;
 wenzelm parents: 
25732diff
changeset | 151 | result := Exn.capture f x)); | 
| 12990 | 152 | Signals.setHandler (Signals.sigINT, old_handler); | 
| 26084 
a7475459c740
replaced ignore/raise_interrupt by more flexible (un)interruptible combinators;
 wenzelm parents: 
25732diff
changeset | 153 | Exn.release (! result) | 
| 12990 | 154 | end; | 
| 5816 | 155 | |
| 26084 
a7475459c740
replaced ignore/raise_interrupt by more flexible (un)interruptible combinators;
 wenzelm parents: 
25732diff
changeset | 156 | fun uninterruptible f = | 
| 
a7475459c740
replaced ignore/raise_interrupt by more flexible (un)interruptible combinators;
 wenzelm parents: 
25732diff
changeset | 157 | change_signal Signals.IGNORE | 
| 
a7475459c740
replaced ignore/raise_interrupt by more flexible (un)interruptible combinators;
 wenzelm parents: 
25732diff
changeset | 158 | (fn old_handler => f (fn g => change_signal old_handler (fn _ => g))); | 
| 
a7475459c740
replaced ignore/raise_interrupt by more flexible (un)interruptible combinators;
 wenzelm parents: 
25732diff
changeset | 159 | |
| 
a7475459c740
replaced ignore/raise_interrupt by more flexible (un)interruptible combinators;
 wenzelm parents: 
25732diff
changeset | 160 | end; | 
| 
a7475459c740
replaced ignore/raise_interrupt by more flexible (un)interruptible combinators;
 wenzelm parents: 
25732diff
changeset | 161 | |
| 21298 
6d2306b2376d
tuned names of start_timing,/end_timing/check_timer;
 wenzelm parents: 
18790diff
changeset | 162 | |
| 39616 
8052101883c3
renamed setmp_noncritical to Unsynchronized.setmp to emphasize its meaning;
 wenzelm parents: 
39585diff
changeset | 163 | use "ML-Systems/unsynchronized.ML"; | 
| 
8052101883c3
renamed setmp_noncritical to Unsynchronized.setmp to emphasize its meaning;
 wenzelm parents: 
39585diff
changeset | 164 | |
| 48416 | 165 | |
| 166 | (* ML system operations *) | |
| 167 | ||
| 43948 | 168 | use "ML-Systems/ml_system.ML"; | 
| 169 | ||
| 48416 | 170 | structure ML_System = | 
| 171 | struct | |
| 172 | ||
| 173 | open ML_System; | |
| 174 | ||
| 175 | fun save_state name = | |
| 176 | if SMLofNJ.exportML name then () | |
| 177 |   else OS.FileSys.rename {old = name ^ "." ^ platform, new = name};
 | |
| 178 | ||
| 179 | end; | |
| 180 |