A simple file copy program in ATS
by Timmy Jose
The more I learn of ATS, the more I’m fascinated by it. Notwithstanding the talk which pokes sufficient (light-hearted) fun at ATS, I actually find it very logical, including the naming and organisation of files, libraries, and concepts. After the initial get-go, it’s been a veritable pleasure learning ATS.
I’m halfway through the first book, and there are a few more to complete, but I can see myself using ATS for a wide variety of projects - all the way from low-level programming to the very highest abstractions.
Here is a simple program which copies the input file to the output file. Note the use of
strptr_free which is required by the ATS tupe checker. Omitting this would lead to a
compile-time error since the value returned by
fileref_get_line_string is a linear type (of string). Very nice!
#include "share/atspre_staload.hats" fn copy_file ( inpath: string, outpath: string ): void = let val infil_ref = fileref_open_exn (inpath, file_mode_r) val outfil_ref = fileref_open_exn (outpath, file_mode_w) fun loop ( infil_ref: FILEref, outfil_ref: FILEref ): void = if fileref_isnot_eof (infil_ref) then let val line = fileref_get_line_string (infil_ref) val () = fprint (outfil_ref, line) val () = fprint_newline (outfil_ref) val () = strptr_free (line) in loop (infil_ref, outfil_ref) end in loop (infil_ref, outfil_ref); fileref_close (infil_ref); fileref_close (outfil_ref) end implement main0 () = copy_file ("hamlet.in", "hamlet.out")
Testing it out:
$ cat hamlet.in To be, or not to be. That is the question! Exeunt. $ patscc -DATS_MEMALLOC_LIBC -flto -cleanaft -O3 -latslib -o copyfile copyfile.dats && ./copyfile $ cat hamlet.out To be, or not to be. That is the question! Exeunt.