]> Joshua Wise's Git repositories - snipe.git/blob - util/safe-io.sml
30b9c1671b7997492b71c1b63504ff44ef43fd1f
[snipe.git] / util / safe-io.sml
1 (* L1 Compiler
2  * Safe(r) I/O functions
3  * Author: Frank Pfenning <fp@cs.cmu.edu>
4  *)
5
6 signature SAFE_IO =
7 sig
8   (* withOpenIn fileName (fn instream => body) = result
9      opens fileName for input to obtain instream and evaluates body.
10      The file is closed during normal and abnormal exit of body.
11   *)
12   val withOpenIn : string -> (TextIO.instream -> 'a) -> 'a
13
14   (* withOpenOut fileName (fn outstream => body) = result
15      opens fileName for output to obtain outstream and evaluates body.
16      The file is closed during normal and abnormal exit of body.
17   *)
18   val withOpenOut : string -> (TextIO.outstream -> 'a) -> 'a
19 end
20
21 structure SafeIO :> SAFE_IO =
22 struct
23
24   (* result of a computation *)
25   datatype 'a Result = Value of 'a | Exception of exn
26
27
28   (* withOpenIn fileName (fn instream => body) = result
29      opens fileName for input to obtain instream and evaluates body.
30      The file is closed during normal and abnormal exit of body.
31   *)
32   fun withOpenIn (fileName) (scope) =
33       let
34         val instream = TextIO.openIn fileName
35         (* val _ = fileOpenMsg (fileName) *)
36         val result = Value (scope instream) handle exn => Exception (exn)
37         (* val _ = fileCloseMsg (fileName) *)
38         val _ = TextIO.closeIn instream
39       in
40         case result
41           of Value (x) => x
42            | Exception (exn) => raise exn
43       end
44
45   (* withOpenOut fileName (fn outstream => body) = result
46      opens fileName for input to obtain outstream and evaluates body.
47      The file is closed during normal and abnormal exit of body.
48   *)
49   fun withOpenOut (fileName) (scope) =
50       let
51         val outstream = TextIO.openOut fileName
52         (* val _ = fileOpenMsg (fileName) *)
53         val result = Value (scope outstream) handle exn => Exception (exn)
54         (* val _ = fileCloseMsg (fileName) *)
55         val _ = TextIO.closeOut outstream
56       in
57         case result
58           of Value (x) => x
59            | Exception (exn) => raise exn
60       end
61 end
This page took 0.023545 seconds and 4 git commands to generate.