src/Pure/ML-Systems/smlnj-1.09.ML
author paulson
Tue, 01 Jul 1997 10:45:59 +0200
changeset 3473 c2334f9532ab
parent 3048 a4b609108712
child 3591 412c62dd43de
permissions -rw-r--r--
New and stronger lemmas; more default simp/cla rules

(*  Title:      Pure/ML-Systems/smlnj-1.09.ML
    ID:         $Id$
    Author:     Carsten Clasohm, TU Muenchen
    Copyright   1996  TU Muenchen

Compatibility file for Standard ML of New Jersey, version 1.09.27 or later.
*)

(** Poly/ML emulation **)

fun quit () = exit 0;

(*to 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);

Compiler.Control.primaryPrompt := "> ";
Compiler.Control.secondaryPrompt := "# ";


(* interface for toplevel pretty printers, 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;


(** 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);


(** Character / string functions which are compatible with 0.93 and Poly/ML **)

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;


(** Timing functions **)

(*A conditional timing function: applies f to () and, if the flag is true,
  prints its runtime. *)
fun cond_timeit flag f =
  if flag then
    let open Time  (*...for Time.toString, Time.+ and Time.- *)
	val CPUtimer = Timer.startCPUTimer();
        val {gc=gct1,sys=syst1,usr=usrt1} = Timer.checkCPUTimer(CPUtimer);
        val result = f();
        val {gc=gct2,sys=syst2,usr=usrt2} = Timer.checkCPUTimer(CPUtimer)
    in  print("User " ^ toString (usrt2-usrt1) ^
              "  GC " ^ toString (gct2-gct1) ^
              "  All "^ toString (syst2-syst1 + usrt2-usrt1 + gct2-gct1) ^
              " secs\n")
	  handle Time => ();
        result
    end
  else f ();


(** File handling **)

(*get time of last modification; if file doesn't exist return an empty string*)
fun file_info "" = ""
  | file_info name = Time.toString (OS.FileSys.modTime name) handle _ =>"";


(** ML command execution **)

val use_string = Compiler.Interact.useStream o TextIO.openString o implode;


(** System command execution **)

(*Execute an Unix command which doesn't take any input from stdin and
  sends its output to stdout.
  This could be done more easily by Unix.execute, but that function
  doesn't use the PATH.*)
fun execute command =
  let val tmp_name = "isa_converted.tmp"
      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;


(** non-ASCII input **)

val needs_filtered_use = false;