Title here
Summary here
Here’s the translation of the Go code for reading files into Standard ML:
(* Reading and writing files are basic tasks needed for
many Standard ML programs. First we'll look at some examples of
reading files. *)
(* Helper function to handle exceptions *)
fun check f x =
f x
handle e => (print ("Error: " ^ exnMessage e ^ "\n"); raise e)
(* Perhaps the most basic file reading task is
slurping a file's entire contents into memory. *)
val dat = check (TextIO.openIn >> TextIO.inputAll) "/tmp/dat"
val _ = print dat
(* You'll often want more control over how and what
parts of a file are read. For these tasks, start
by opening a file to obtain a TextIO.instream value. *)
val f = check TextIO.openIn "/tmp/dat"
(* Read some bytes from the beginning of the file.
Allow up to 5 to be read but also note how many
actually were read. *)
val b1 = check (TextIO.inputN f) 5
val _ = print (Int.toString (String.size b1) ^ " bytes: " ^ b1 ^ "\n")
(* You can also seek to a known location in the file
and read from there. *)
val _ = check (TextIO.StreamIO.setPosition (TextIO.getInstream f)) 6
val b2 = check (TextIO.inputN f) 2
val _ = print ("2 bytes @ 6: " ^ b2 ^ "\n")
(* Other methods of seeking are relative to the
current cursor position, *)
val _ = check (TextIO.StreamIO.skipChars (TextIO.getInstream f)) 4
(* and relative to the end of the file. *)
val _ = check (TextIO.StreamIO.setPosition (TextIO.getInstream f))
(TextIO.StreamIO.endPosition (TextIO.getInstream f) - 10)
(* The TextIO structure provides some functions that may
be helpful for file reading. For example, reads
like the ones above can be more robustly
implemented with inputN. *)
val _ = check (TextIO.StreamIO.setPosition (TextIO.getInstream f)) 6
val b3 = check (TextIO.inputN f) 2
val _ = print ("2 bytes @ 6: " ^ b3 ^ "\n")
(* There is no built-in rewind, but
setPosition 0 accomplishes this. *)
val _ = check (TextIO.StreamIO.setPosition (TextIO.getInstream f)) 0
(* The TextIO structure implements buffered
reading that may be useful both for its efficiency
with many small reads and because of the additional
reading methods it provides. *)
val b4 = check (TextIO.inputN f) 5
val _ = print ("5 bytes: " ^ b4 ^ "\n")
(* Close the file when you're done *)
val _ = TextIO.closeIn fTo run this program:
$ echo "hello" > /tmp/dat
$ echo "ml" >> /tmp/dat
$ sml reading-files.sml
hello
ml
5 bytes: hello
2 bytes @ 6: ml
2 bytes @ 6: ml
5 bytes: helloThis Standard ML code demonstrates various file reading operations, including:
Note that Standard ML’s file I/O operations are primarily based on the TextIO structure, which provides functions for text-based file operations. The exact equivalents of some Go operations (like Peek) are not available, but similar functionality can be achieved using the provided functions.
Also, error handling in Standard ML is typically done using exceptions, which is why we’ve defined a check function to handle potential errors.
Next, we’ll look at writing files.