src/Pure/ML-Systems/mosml.ML
author wenzelm
Mon, 11 Dec 2006 19:05:23 +0100
changeset 21770 ea6f846d8c4b
parent 21298 6d2306b2376d
child 22144 c33450acd873
permissions -rw-r--r--
added use_file;
     1 (*  Title:      Pure/ML-Systems/mosml.ML
     2     ID:         $Id$
     3     Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
     4     Copyright   1999  University of Cambridge
     5 
     6 Compatibility file for Moscow ML 2.01
     7 
     8 NOTE: saving images does not work; may run it interactively as follows:
     9 
    10 $ cd ~~/src/Pure
    11 $ isabelle RAW_ML_SYSTEM
    12 > val ml_system = "mosml";
    13 > use "ML-Systems/mosml.ML";
    14 > use "ROOT.ML";
    15 > Session.finish ();
    16 > cd "../HOL";
    17 > use "ROOT.ML";
    18 *)
    19 
    20 (** ML system related **)
    21 
    22 load "Obj";
    23 load "Bool";
    24 load "Int";
    25 load "Real";
    26 load "ListPair";
    27 load "OS";
    28 load "Process";
    29 load "FileSys";
    30 load "IO";
    31 
    32 (*low-level pointer equality*)
    33 local val cast : 'a -> int = Obj.magic
    34 in fun pointer_eq (x:'a, y:'a) = (cast x = cast y) end;
    35 
    36 (*proper implementation available?*)
    37 structure IntInf =
    38 struct
    39   open Int;
    40 end;
    41 
    42 structure Real =
    43 struct
    44   open Real;
    45   val realFloor = real o floor;
    46 end;
    47 
    48 structure String =
    49 struct
    50   fun isSuffix s1 s2 =
    51     let val n1 = size s1 and n2 = size s2
    52     in if n1 = n2 then s1 = s2 else n1 <= n2 andalso String.substring (s2, n2 - n1, n1) = s1 end;
    53   open String;
    54 end;
    55 
    56 structure Time =
    57 struct
    58   open Time;
    59   fun toString t = Time.toString t
    60     handle Overflow => Real.toString (Time.toReal t);   (*workaround Y2004 bug*)
    61 end;
    62 
    63 structure OS =
    64 struct
    65   open OS
    66   structure Process = Process
    67   structure FileSys = FileSys
    68 end;
    69 
    70 (*limit the printing depth*)
    71 fun print_depth n =
    72  (Meta.printDepth := n div 2;
    73   Meta.printLength := n);
    74 
    75 (*interface for toplevel pretty printers, see also Pure/install_pp.ML*)
    76 (*the documentation refers to an installPP but I couldn't fine it!*)
    77 fun make_pp path pprint = ();
    78 fun install_pp _ = ();
    79 
    80 (*dummy implementation*)
    81 fun ml_prompts p1 p2 = ();
    82 
    83 (*dummy implementation*)
    84 fun profile (n: int) f x = f x;
    85 
    86 (*dummy implementation*)
    87 fun exception_trace f = f ();
    88 
    89 (*dummy implementation*)
    90 fun print x = x;
    91 
    92 
    93 (** Compiler-independent timing functions **)
    94 
    95 load "Timer";
    96 
    97 fun start_timing () =
    98   let val CPUtimer = Timer.startCPUTimer();
    99       val time = Timer.checkCPUTimer(CPUtimer)
   100   in  (CPUtimer,time)  end;
   101 
   102 fun end_timing (CPUtimer, {gc,sys,usr}) =
   103   let open Time  (*...for Time.toString, Time.+ and Time.- *)
   104       val {gc=gc2,sys=sys2,usr=usr2} = Timer.checkCPUTimer(CPUtimer)
   105   in  "User " ^ toString (usr2-usr) ^
   106       "  GC " ^ toString (gc2-gc) ^
   107       "  All "^ toString (sys2-sys + usr2-usr + gc2-gc) ^
   108       " secs"
   109       handle Time => ""
   110   end;
   111 
   112 fun check_timer timer =
   113   let val {sys, usr, gc} = Timer.checkCPUTimer timer
   114   in (sys, usr, gc) end;
   115 
   116 
   117 (* SML basis library fixes *)
   118 
   119 structure TextIO =
   120 struct
   121   fun canInput _ = raise IO.Io {cause = Fail "undefined", function = "canInput", name = ""};
   122   open TextIO;
   123 end;
   124 
   125 
   126 (* bounded time execution *)
   127 
   128 (*dummy implementation*)
   129 fun interrupt_timeout time f x =
   130   f x;
   131 
   132 
   133 (* ML command execution *)
   134 
   135 (*Can one redirect 'use' directly to an instream?*)
   136 fun use_text _ _ txt =
   137   let
   138     val tmp_name = FileSys.tmpName ();
   139     val tmp_file = TextIO.openOut tmp_name;
   140   in
   141     TextIO.output (tmp_file, txt);
   142     TextIO.closeOut tmp_file;
   143     use tmp_name;
   144     FileSys.remove tmp_name
   145   end;
   146 
   147 fun use_file _ _ name = PolyML.use name;
   148 
   149 
   150 
   151 (** interrupts **)      (*Note: may get into race conditions*)
   152 
   153 (* FIXME proper implementation available? *)
   154 
   155 exception Interrupt;
   156 
   157 fun ignore_interrupt f x = f x;
   158 fun raise_interrupt f x = f x;
   159 
   160 
   161 
   162 (** OS related **)
   163 
   164 (* system command execution *)
   165 
   166 (*execute Unix command which doesn't take any input from stdin and
   167   sends its output to stdout; could be done more easily by Unix.execute,
   168   but that function doesn't use the PATH*)
   169 fun execute command =
   170   let
   171     val tmp_name = FileSys.tmpName ();
   172     val is = (Process.system (command ^ " > " ^ tmp_name); TextIO.openIn tmp_name);
   173     val result = TextIO.inputAll is;
   174   in
   175     TextIO.closeIn is;
   176     FileSys.remove tmp_name;
   177     result
   178   end;
   179 
   180 (*plain version; with return code*)
   181 fun system cmd =
   182   if Process.system cmd = Process.success then 0 else 1;
   183 
   184 
   185 val string_of_pid = Int.toString;
   186 
   187 
   188 (* getenv *)
   189 
   190 fun getenv var =
   191   (case Process.getEnv var of
   192     NONE => ""
   193   | SOME txt => txt);