src/Pure/ML-Systems/smlnj.ML
changeset 4403 1914f727f93f
child 4407 7d4e2832b791
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Pure/ML-Systems/smlnj.ML	Fri Dec 12 22:41:15 1997 +0100
@@ -0,0 +1,122 @@
+(*  Title:      Pure/ML-Systems/smlnj.ML
+    ID:         $Id$
+    Author:     Carsten Clasohm and Markus Wenzel, TU Muenchen
+
+Compatibility file for Standard ML of New Jersey versions 109.27 to
+109.33, 110 or later.
+*)
+
+(** ML system related **)
+
+(* restore old-style character / string functions *)
+
+fun ord s = Char.ord (String.sub (s, 0));
+val chr = str o Char.chr;
+val explode = (map str) o String.explode;
+val implode = String.concat;
+
+
+(* New Jersey ML parameters *)
+
+val _ =
+ (Compiler.Control.Print.printLength := 1000;
+  Compiler.Control.Print.printDepth := 350;
+  Compiler.Control.Print.stringDepth := 250;
+  Compiler.Control.Print.signatures := 2);
+
+
+(* Poly/ML emulation *)
+
+fun quit () = exit 0;
+
+(*limit the printing depth -- divided by 2 for comparibility with Poly/ML*)
+fun print_depth n =
+ (Compiler.Control.Print.printDepth := n div 2;
+  Compiler.Control.Print.printLength := n);
+
+(*Poly/ML-like prompts*)
+Compiler.Control.primaryPrompt := "> ";
+Compiler.Control.secondaryPrompt := "# ";
+
+
+(** Compiler-independent timing functions **)
+
+(*Note start point for timing*)
+fun startTiming() = 
+  let val CPUtimer = Timer.startCPUTimer();
+      val time = Timer.checkCPUTimer(CPUtimer)
+  in  (CPUtimer,time)  end;
+
+(*Finish timing and return string*)
+fun endTiming (CPUtimer, {gc,sys,usr}) =
+  let open Time  (*...for Time.toString, Time.+ and Time.- *)
+      val {gc=gc2,sys=sys2,usr=usr2} = Timer.checkCPUTimer(CPUtimer)
+  in  "User " ^ toString (usr2-usr) ^
+      "  GC " ^ toString (gc2-gc) ^
+      "  All "^ toString (sys2-sys + usr2-usr + gc2-gc) ^
+      " secs"
+      handle Time => ""
+  end;
+
+
+(* toplevel pretty printing (see also Pure/install_pp.ML) *)
+
+fun make_pp path pprint =
+  let
+    open Compiler.PrettyPrint;
+
+    fun pp pps obj =
+      pprint obj
+        (add_string pps, begin_block pps INCONSISTENT,
+          fn wd => add_break pps (wd, 0), fn () => add_newline pps,
+          fn () => end_block pps);
+  in
+    (path, pp)
+  end;
+
+fun install_pp (path, pp) = Compiler.PPTable.install_pp path pp;
+
+
+(* ML command execution *)
+
+val use_strings = Compiler.Interact.useStream o TextIO.openString o implode;
+
+
+
+(** OS related **)
+
+(* system command execution *)
+
+(*execute Unix command which doesn't take any input from stdin and
+  sends its output to stdout; could be done more easily by Unix.execute,
+  but that function doesn't use the PATH*)
+fun execute command =
+  let
+    val tmp_name = OS.FileSys.tmpName ();
+    val is = (OS.Process.system (command ^ " > " ^ tmp_name); TextIO.openIn tmp_name);
+    val result = TextIO.inputAll is;
+  in
+    TextIO.closeIn is;
+    OS.FileSys.remove tmp_name;
+    result
+  end;
+
+
+(* file handling *)
+
+(*get time of last modification; if file doesn't exist return an empty string*)
+fun file_info "" = ""		(* FIXME !? *)
+  | file_info name = Time.toString (OS.FileSys.modTime name) handle _ => "";
+
+
+(* getenv *)
+
+fun getenv var =
+  (case OS.Process.getEnv var of
+    NONE => ""
+  | SOME txt => txt);
+
+
+(* non-ASCII input (see also Thy/symbol_input.ML) *)
+
+val needs_filtered_use = false;