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