SRFI 36: I/O コンディション

表題

I/O コンディション

著者

Michael Sperber

状態

この SRFI は現在「確定」の状態である。 SRFI の各状態の説明については ここ を参照せよ。 この SRFI は 2002-10-20 になるまで、あるいは、修正が終わるまでは 草案の状態に留まるだろう。 この SRFI の議論に投稿するには、 srfi minus 36 at srfi dot schemers dot org にメールを送信してください。 このメーリングリストに参加する方法については ここの説明 を参照せよ。 この SRFI に関する議論については メーリングリストのアーカイブ を参照せよ。 この SRFI に関する確定後の議論については メーリングリストのアーカイブ を参照せよ。

概要

この SRFI では I/O エラーのためのコンディション型を定義する。 コンディション型は SRFI 35 で定義されている。 この SRFI では、 R5RSI/O 操作 を実行中にエラーが発生した場合に、 SRFI 34 の意味で例外をレイズする Scheme 実装を必要とする。

論拠

現状の R5RS で定義されている I/O 操作は、 様々な予測できない方法で失敗する可能性があるので、 実用的なコードを書くプログラマにとっては利用価値が低い。 R5RS では、I/O 操作が失敗したときは、エラーを発生させることを要求している。 これはつまり、I/O 操作が失敗した場合には、何らかの処理を行うことはできないということである。 しかし、I/O 操作が失敗することを未然に防ぐことはできないにしても、 意味のあるリカバリ処理は可能なはずである。

そこでこの SRFI では、I/O 操作が失敗した場合は、 Scheme 処理系は SRFI 34 の仕組みを介して エラーに関する情報を伝達することを要求する。 さらに、Scheme 処理系はこの SRFI で定義するコンディション型の1つに属するコンディションを使用して エラーの性質を伝達することを要求する。 このコンディション型階層は非常に細分化されているので、 エラーの性質を正確に知ることができる。

仕様

I/O コンディション型

この節では、I/O 関係のコンディション型を定義する。 SRFI 35 のマクロを使用して定義すると共に、 その型の意図を説明する。

階層

I/O コンディション型の階層を以下に示す。 各コンディション型の詳細な説明は後述する。

意図している意味

(define-condition-type &i/o-error &error
  i/o-error?)

より特殊化された I/O エラーのための基底型である。

(define-condition-type &i/o-port-error &i/o-error
  i/o-port-error?
  (port i/o-error-port))

このコンディション型は、ポート操作時に発生した I/O エラーを表す。 この型に属するコンディションは port フィールドにポートを指定しなければならない。

(define-condition-type &i/o-read-error &i/o-port-error
  i/o-read-error?)

このコンディション型は、ポート操作時の読み取りエラーを表す。

(define-condition-type &i/o-write-error &i/o-port-error
  i/o-write-error?)

このコンディション型は、ポート操作時の書き込みエラーを表す。

(define-condition-type &i/o-closed-error &i/o-port-error
  i/o-closed-error?)

このコンディション型は、オープンされているポートが必要な状況で、クローズされているポートに対して操作を行ったことを表す。

(define-condition-type &i/o-filename-error &i/o-error
  i/o-filename-error?
  (filename i/o-error-filename))

このコンディション型は、名前付きファイルの操作時に発生した I/O エラーを表す。 この型に属するコンディションは filename フィールドにファイル名を指定しなければならない。

(define-condition-type &i/o-malformed-filename-error &i/o-filename-error
  i/o-malformed-filename-error?)

このコンディション型は、ファイル名が不正な形式であることを表します。

(define-condition-type &i/o-file-protection-error &i/o-filename-error
  i/o-file-protection-error?)

このコンディション型は、十分なアクセス権限を持たない名前付きファイルに対して操作を行おうとしたことを表す。

(define-condition-type &i/o-file-is-read-only-error &i/o-file-protection-error
  i/o-file-is-read-only-error?)

このコンディション型は、書き込み可能な名前付きファイルが必要な状況で、読み取り専用の名前付きファイルであったことを表す。

(define-condition-type &i/o-file-already-exists-error &i/o-filename-error
  i/o-file-already-exists-error?)

このコンディション型は、名前付きファイルが存在していないと想定されている状況で、存在していることを表す。

(define-condition-type &i/o-no-such-file-error &i/o-filename-error
  i/o-no-such-file-error?)

このコンディション型は、名前付きファイルが存在していると想定されている状況で、存在していないことを表す。

(define-condition-type &read-error &error
  read-error?
  (line read-error-line)
  (column read-error-column)
  (position read-error-position)
  (span read-error-span))

このコンディション型は、read 操作時の解析エラーを表す。 エラーの詳細はフィールドに記録される。 しかし、Scheme 処理系は実際にエラーの詳細をフィールドに記録しなくてもよい。 記録しない場合は、フィールド値は #f でよい。

フィールド値が #f でない場合は、以下の情報を含めなければならない:

標準手続き

以下に示した手続きは、必要に応じて、上記で定義したコンディション型をレイズしなければならない。

call-with-input-file &i/o-filename-error
call-with-output-file &i/o-filename-error
with-input-from-file &i/o-filename-error
with-output-to-file &i/o-filename-error
output-input-file &i/o-filename-error
output-output-file &i/o-filename-error
close-output-port &i/o-write-error
read &i/o-read-error
&read-error
read-char &i/o-read-error
peek-char &i/o-read-error
write &i/o-write-error
display &i/o-write-error
newline &i/o-write-error
write-char &i/o-write-error

read 手続きは、 読み取りエラーが発生したときは &i/o-read-error コンディションをレイズし、 解析エラーが発生したときは &read-error コンディションをレイズしなければならない。

参考文献

著作権

Copyright (C) Michael Sperber (2002). All Rights Reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


編集者: Francisco Solsona