単純な入力と出力

ATS 言語で I/O を扱うには依存型と線形型を使う必要があり、これは別の章で解説します。 この章では、プログラマが使うことのできる基本的な I/O へのアクセス手段を解説します。

ファイルハンドルは本質的には (バイト列としての) ストリームと (整数値として表現される) ファイル識別子を結び付けます。 ATS では、ファイルハンドルの型は FILEref です。 次に挙げるような3つの標準ファイルハンドルがあります:

ファイルハンドルに関連する様々な関数が filebas.sats ファイルで宣言されています。 このファイルは atsopt で自動的に読み込まれます。 例えば、 ファイルハンドルのオープンとクローズを行なう関数は次のようなインターフェイスを持っています:

fun fileref_open_exn ( path: string, fm: file_mode ) : FILEref // endfun fun fileref_close (fil: FILEref): void

これらの2つの関数はエラーが発生した時点で即座に中断することに注意してください。 次の関数は fileref_open_exn の別バージョンで、 ファイルハンドルが実際に得られたかどうか、 fileref_open_opt の呼び出し元が返値を検査する必要があります。

fun fileref_open_opt (path: string, fm: file_mode) : Option_vt (FILEref)

file_mode は次に挙げるようなファイルモードを表わす値です:

例として、次の短かいプログラムはファイルハンドルを開き、 文字列 "Hello, world!" と改行をファイルハンドルに関連するストリームに出力し、 最後にファイルハンドルを閉じます:

implement main0 () = { val out = fileref_open_exn ("hello.txt", file_mode_w) val () = fprint_string (out, "Hello, world!n") val () = fileref_close (out) // } (* end of [main0] *)

このプログラムを実行した後、 現在のワーキングディレクトリに期待される内容を含む "hello.txt" と名前のついたファイルが得られます。 与えられたファイルハンドルに関連するストリームへデータを印字するような、様々な fprint 関数が ATS にはあります。 ATS ではオーバーロードがサポートされているため、 しばしばプログラマはこれらの関数を参照するために単純に fprint という名前を使うことができます。

別の一般的な I/O 関数として次のようなインターフェイスがあります:

fun fileref_get_line_string (fil: FILEref): Strptr1

関数 fileref_get_line_string は与えられたファイルハンドルに対応するストリームから1行読み込みます。 そしてその返値は Strptr1 型になります。 さしあたり、このような値は明示的に解放しなければならない文字列のようなものであると、 単純に説明することにとどめます。 例として、次の短かいプログラムは、標準入力から一行読み込み標準出力にエコーします:

implement main0 ( // argumentless ) = loop () where { // fun loop (): void = let val isnot = fileref_isnot_eof (stdin_ref) in // if isnot then let val line = fileref_get_line_string (stdin_ref) val ((*void*)) = fprintln! (stdout_ref, line) val ((*void*)) = strptr_free (line) in loop () end else ((*loop exits as the end-of-file is reached*)) // end (* end of [loop] *) // } (* end of [main0] *)

(Strptr1 型の)線形文字列を解放するために、 関数 strptr_free が呼び出されていることに注意してください。 CTRL-D を入力することで入力の行をエコーしている上記のプログラムを終了することができます。