R6RS:翻訳:R6RS:11.14 Errors and violations
11.14 エラーと違反
[procedure] (error who message irritant1 ...)
[procedure] (assertion-violation who message irritant1 ...)
who は文字列ないしシンボルないし #f、 message は文字列でなければならない。 irritant は任意のオブジェクトである。
これらの手続きは例外を発生させる。 error 手続きは、エラーが起こった場合、典型的にはプログラムと外部世界ないし利用者の相互作用で何か失敗の起こった場合に呼び出されるべきである。 assertion-violation 手続きは手続きの不正な呼び出しが行われたときに呼び出される。引き数の個数が不正である場合、扱えると指定されていない引き数が渡された場合、などである。
who 引き数は例外を検知した手続きないし操作を説明しなければならない。 message 引き数は例外的な状況について説明すべきである。 irritant は操作を(訳注: 例外を?)検知した操作への引き数である。
例外によってもたらされるコンディションオブジェクト(R6RS:翻訳:Standard Libraries:7 Exceptions and conditions 参照)は次のコンディション型を持つ。
- who が #f でない場合、コンディションは &who コンディション型を持ち、 who をそのフィールドの値として持つ。この場合、 who は例外を検知した手続きないし実体の名前であるべきである。 #f であった場合は、コンディションは &who コンディション型を持たない。
- コンディションは message をそのフィールドの値として &message コンディション型を持つ。
- コンディションは &irritants コンディション型を持ち、そのフィールドの値として irritant のリストを持つ。
さらに、 error によって作られたコンディションは &error コンディション型を持ち、 assertion-violation によって作られたコンディションは &assertion コンディション型を持つ。
(define (fac n) (if (not (integer-valued? n)) (assertion-violation ’fac "non-integral argument" n)) (if (negative? n) (assertion-violation ’fac "negative argument" n)) (letrec ((loop (lambda (n r) (if (zero? n) r (loop (- n 1) (* r n)))))) (loop n 1))) (fac 5) ⇒ 120 (fac 4.5) &assertion exception (fac -3) &assertion exception
[syntax] (assert <expression>)
assert フォームは <expression> を評価することによって評価される。 <expression> が真値を返した場合、その値が assert 式から返る。 <expression> が #f を返した場合、 &assertion と &message コンディション型の例外が発生する。コンディションオブジェクトに与えられるメッセージは実装系依存である。
注: 実装系は assert が構文であるという事実を利用し、表明の失敗した場所の情報をできるかぎり提供するようにするべきである。