src/Pure/ML-Systems/mosml.ML
author wenzelm
Wed, 01 Oct 2008 12:00:02 +0200
changeset 28443 de653f1ad78b
parent 28268 ac8431ecd57e
child 28489 404649964f09
permissions -rw-r--r--
more robust treatment of Interrupt (cf. exn.ML);
wenzelm@9254
     1
(*  Title:      Pure/ML-Systems/mosml.ML
wenzelm@9254
     2
    ID:         $Id$
wenzelm@9254
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
wenzelm@9254
     4
    Copyright   1999  University of Cambridge
wenzelm@9254
     5
wenzelm@17491
     6
Compatibility file for Moscow ML 2.01
wenzelm@9254
     7
wenzelm@17491
     8
NOTE: saving images does not work; may run it interactively as follows:
wenzelm@9254
     9
wenzelm@23826
    10
$ cd Isabelle/src/Pure
wenzelm@9254
    11
$ isabelle RAW_ML_SYSTEM
wenzelm@9254
    12
> val ml_system = "mosml";
wenzelm@9254
    13
> use "ML-Systems/mosml.ML";
wenzelm@9254
    14
> use "ROOT.ML";
wenzelm@16470
    15
> Session.finish ();
wenzelm@23836
    16
> cd "../FOL";
wenzelm@16470
    17
> use "ROOT.ML";
wenzelm@24808
    18
> Session.finish ();
wenzelm@24808
    19
> cd "../ZF";
wenzelm@24808
    20
> use "ROOT.ML";
wenzelm@9254
    21
*)
wenzelm@9254
    22
wenzelm@9254
    23
(** ML system related **)
wenzelm@9254
    24
wenzelm@24597
    25
val ml_system_fix_ints = false;
wenzelm@24597
    26
wenzelm@26474
    27
fun forget_structure _ = ();
wenzelm@26474
    28
wenzelm@16517
    29
load "Obj";
wenzelm@9254
    30
load "Bool";
wenzelm@9254
    31
load "Int";
wenzelm@9254
    32
load "Real";
wenzelm@9254
    33
load "ListPair";
wenzelm@9254
    34
load "OS";
wenzelm@9254
    35
load "Process";
wenzelm@9254
    36
load "FileSys";
wenzelm@21298
    37
load "IO";
wenzelm@9254
    38
wenzelm@28443
    39
exception Interrupt;
wenzelm@28443
    40
wenzelm@23965
    41
use "ML-Systems/exn.ML";
wenzelm@25732
    42
use "ML-Systems/universal.ML";
wenzelm@24688
    43
use "ML-Systems/multithreading.ML";
wenzelm@24688
    44
use "ML-Systems/time_limit.ML";
wenzelm@28268
    45
use "ML-Systems/ml_name_space.ML";
wenzelm@23921
    46
wenzelm@23921
    47
wenzelm@16517
    48
(*low-level pointer equality*)
wenzelm@16517
    49
local val cast : 'a -> int = Obj.magic
wenzelm@16517
    50
in fun pointer_eq (x:'a, y:'a) = (cast x = cast y) end;
wenzelm@16517
    51
wenzelm@16469
    52
(*proper implementation available?*)
wenzelm@16469
    53
structure IntInf =
wenzelm@16469
    54
struct
wenzelm@24808
    55
  fun divMod (x, y) = (x div y, x mod y);
wenzelm@16469
    56
  open Int;
wenzelm@16469
    57
end;
wenzelm@16469
    58
wenzelm@27003
    59
structure Substring =
wenzelm@27003
    60
struct
wenzelm@27003
    61
  open Substring;
wenzelm@27003
    62
  val full = all;
wenzelm@27003
    63
end;
wenzelm@27003
    64
wenzelm@16469
    65
structure Real =
wenzelm@16469
    66
struct
wenzelm@16469
    67
  open Real;
wenzelm@16469
    68
  val realFloor = real o floor;
wenzelm@16469
    69
end;
wenzelm@16469
    70
wenzelm@17491
    71
structure String =
wenzelm@17491
    72
struct
wenzelm@17491
    73
  fun isSuffix s1 s2 =
wenzelm@17491
    74
    let val n1 = size s1 and n2 = size s2
wenzelm@17491
    75
    in if n1 = n2 then s1 = s2 else n1 <= n2 andalso String.substring (s2, n2 - n1, n1) = s1 end;
wenzelm@17491
    76
  open String;
wenzelm@17491
    77
end;
wenzelm@17491
    78
wenzelm@16469
    79
structure Time =
wenzelm@16469
    80
struct
wenzelm@16469
    81
  open Time;
wenzelm@16469
    82
  fun toString t = Time.toString t
wenzelm@16469
    83
    handle Overflow => Real.toString (Time.toReal t);   (*workaround Y2004 bug*)
wenzelm@16469
    84
end;
wenzelm@16469
    85
wenzelm@9254
    86
structure OS =
wenzelm@16469
    87
struct
wenzelm@9254
    88
  open OS
wenzelm@9254
    89
  structure Process = Process
wenzelm@9254
    90
  structure FileSys = FileSys
wenzelm@16469
    91
end;
wenzelm@16993
    92
wenzelm@22252
    93
exception Option = Option.Option;
wenzelm@22252
    94
wenzelm@22252
    95
wenzelm@9254
    96
(*limit the printing depth*)
wenzelm@24329
    97
local
wenzelm@24329
    98
  val depth = ref 10;
wenzelm@24329
    99
in
wenzelm@24329
   100
  fun get_print_depth () = ! depth;
wenzelm@24329
   101
  fun print_depth n =
wenzelm@24329
   102
   (depth := n;
wenzelm@24329
   103
    Meta.printDepth := n div 2;
wenzelm@24329
   104
    Meta.printLength := n);
wenzelm@24329
   105
end;
wenzelm@9254
   106
wenzelm@24290
   107
(*interface for toplevel pretty printers, see also Pure/pure_setup.ML*)
wenzelm@9254
   108
(*the documentation refers to an installPP but I couldn't fine it!*)
wenzelm@9254
   109
fun make_pp path pprint = ();
wenzelm@9254
   110
fun install_pp _ = ();
wenzelm@9254
   111
wenzelm@16681
   112
(*dummy implementation*)
wenzelm@16681
   113
fun ml_prompts p1 p2 = ();
wenzelm@16681
   114
wenzelm@16681
   115
(*dummy implementation*)
wenzelm@16660
   116
fun profile (n: int) f x = f x;
wenzelm@16660
   117
haftmann@18384
   118
(*dummy implementation*)
wenzelm@16681
   119
fun exception_trace f = f ();
wenzelm@9254
   120
haftmann@18384
   121
(*dummy implementation*)
haftmann@18384
   122
fun print x = x;
haftmann@18384
   123
wenzelm@9254
   124
wenzelm@9254
   125
(** Compiler-independent timing functions **)
wenzelm@9254
   126
wenzelm@9254
   127
load "Timer";
wenzelm@9254
   128
wenzelm@21298
   129
fun start_timing () =
wenzelm@21298
   130
  let val CPUtimer = Timer.startCPUTimer();
wenzelm@21298
   131
      val time = Timer.checkCPUTimer(CPUtimer)
wenzelm@21298
   132
  in  (CPUtimer,time)  end;
wenzelm@21298
   133
wenzelm@21298
   134
fun end_timing (CPUtimer, {gc,sys,usr}) =
wenzelm@21298
   135
  let open Time  (*...for Time.toString, Time.+ and Time.- *)
wenzelm@21298
   136
      val {gc=gc2,sys=sys2,usr=usr2} = Timer.checkCPUTimer(CPUtimer)
wenzelm@21298
   137
  in  "User " ^ toString (usr2-usr) ^
wenzelm@21298
   138
      "  GC " ^ toString (gc2-gc) ^
wenzelm@21298
   139
      "  All "^ toString (sys2-sys + usr2-usr + gc2-gc) ^
wenzelm@21298
   140
      " secs"
wenzelm@21298
   141
      handle Time => ""
wenzelm@21298
   142
  end;
wenzelm@21298
   143
wenzelm@21298
   144
fun check_timer timer =
wenzelm@21298
   145
  let val {sys, usr, gc} = Timer.checkCPUTimer timer
wenzelm@21298
   146
  in (sys, usr, gc) end;
wenzelm@21298
   147
wenzelm@21298
   148
wenzelm@21298
   149
(* SML basis library fixes *)
wenzelm@21298
   150
wenzelm@21298
   151
structure TextIO =
wenzelm@21298
   152
struct
wenzelm@21298
   153
  fun canInput _ = raise IO.Io {cause = Fail "undefined", function = "canInput", name = ""};
wenzelm@21298
   154
  open TextIO;
wenzelm@23836
   155
  fun inputLine is =
wenzelm@23836
   156
    let val s = TextIO.inputLine is
wenzelm@23836
   157
    in if s = "" then NONE else SOME s end;
wenzelm@21298
   158
end;
wenzelm@21298
   159
wenzelm@9254
   160
wenzelm@9254
   161
(* ML command execution *)
wenzelm@9254
   162
wenzelm@9254
   163
(*Can one redirect 'use' directly to an instream?*)
wenzelm@28268
   164
fun use_text (tune: string -> string) _ _ _ _ _ txt =
wenzelm@9254
   165
  let
wenzelm@9254
   166
    val tmp_name = FileSys.tmpName ();
wenzelm@9254
   167
    val tmp_file = TextIO.openOut tmp_name;
wenzelm@9254
   168
  in
wenzelm@24808
   169
    TextIO.output (tmp_file, tune txt);
wenzelm@9254
   170
    TextIO.closeOut tmp_file;
wenzelm@9254
   171
    use tmp_name;
wenzelm@9254
   172
    FileSys.remove tmp_name
wenzelm@9254
   173
  end;
wenzelm@9254
   174
wenzelm@28268
   175
fun use_file _ _ _ _ _ name = use name;
wenzelm@21770
   176
wenzelm@9254
   177
wenzelm@9254
   178
wenzelm@16993
   179
(** interrupts **)      (*Note: may get into race conditions*)
wenzelm@9254
   180
wenzelm@9254
   181
(* FIXME proper implementation available? *)
wenzelm@9254
   182
wenzelm@26084
   183
fun interruptible f x = f x;
wenzelm@26084
   184
fun uninterruptible f x = f (fn (g: 'c -> 'd) => g) x;
wenzelm@9254
   185
wenzelm@9254
   186
wenzelm@9254
   187
wenzelm@9254
   188
(** OS related **)
wenzelm@9254
   189
wenzelm@26223
   190
(*dummy implementation*)
wenzelm@26223
   191
structure Posix =
wenzelm@26223
   192
struct
wenzelm@26223
   193
  structure ProcEnv =
wenzelm@26223
   194
  struct
wenzelm@26223
   195
    fun getpid () = 0;
wenzelm@26223
   196
  end;  
wenzelm@26223
   197
end;
wenzelm@26223
   198
wenzelm@26223
   199
local
wenzelm@26223
   200
wenzelm@26223
   201
fun read_file name =
wenzelm@26223
   202
  let val is = TextIO.openIn name
wenzelm@26504
   203
  in Exn.release (Exn.capture TextIO.inputAll is before TextIO.closeIn is) end;
wenzelm@26223
   204
wenzelm@26223
   205
fun write_file name txt =
wenzelm@26223
   206
  let val os = TextIO.openOut name
wenzelm@26504
   207
  in Exn.release (Exn.capture TextIO.output (os, txt) before TextIO.closeOut os) end;
wenzelm@26223
   208
wenzelm@26223
   209
in
wenzelm@26223
   210
wenzelm@26223
   211
fun system_out script =
wenzelm@26223
   212
  let
wenzelm@26223
   213
    val script_name = OS.FileSys.tmpName ();
wenzelm@26223
   214
    val _ = write_file script_name script;
wenzelm@26223
   215
wenzelm@26223
   216
    val output_name = OS.FileSys.tmpName ();
wenzelm@26223
   217
wenzelm@26223
   218
    val status =
wenzelm@26223
   219
      OS.Process.system ("perl -w \"$ISABELLE_HOME/lib/scripts/system.pl\" nogroup " ^
wenzelm@26223
   220
        script_name ^ " /dev/null " ^ output_name);
wenzelm@26223
   221
    val rc = if status = OS.Process.success then 0 else 1;
wenzelm@26223
   222
wenzelm@26223
   223
    val output = read_file output_name handle IO.Io _ => "";
wenzelm@26223
   224
    val _ = OS.FileSys.remove script_name handle OS.SysErr _ => ();
wenzelm@26223
   225
    val _ = OS.FileSys.remove output_name handle OS.SysErr _ => ();
wenzelm@26223
   226
  in (output, rc) end;
wenzelm@26223
   227
wenzelm@26223
   228
end;
wenzelm@26223
   229
wenzelm@23826
   230
val cd = OS.FileSys.chDir;
wenzelm@23826
   231
val pwd = OS.FileSys.getDir;
wenzelm@23826
   232
wenzelm@17824
   233
val string_of_pid = Int.toString;
wenzelm@17824
   234
wenzelm@9254
   235
fun getenv var =
wenzelm@9254
   236
  (case Process.getEnv var of
wenzelm@9254
   237
    NONE => ""
wenzelm@9254
   238
  | SOME txt => txt);