Next: , Previous: , Up: Programming Tools   [Contents][Index]


6.26.8 Assertions

特にメンテナンス中に無効になる可能性があると仮定する場合(たとえば、 データ構造の特定のフィールドは決してゼロにならない、 等)、 プログラムを自己チェックするようにすることをお勧めします。 Gforth は、 こ​​の目的のために「アサート」(assertions)をサポートしています。 それらは以下のように使用します:

assert( flag )

assert() の間のコードは flag を計算する必要があります。 すべてが正常な場合は true 、それ以外の場合は false になります。 スタック上の他のものは何も変更しないでください。 アサートの全体的なスタック効果は ( -- ) です。 例:

assert( 1 1 + 2 = ) \ what we learn in school
assert( dup 0<> ) \ assert that the top of stack is not zero
assert( false ) \ このコードには決して到達してはならない

アサートの必要性は、 その時々によって異なります。 デバッグ中はより多くのチェックが必要ですが、 運用環境では速度をより重視することがあります。 したがって、アサートをオフにすることができます。 その場合、 つまり、 アサートはコメントになります。 アサートの重要性とそのチェックにかかる時間に応じて、 一部のアサートをオフにし、 他のアサートをオンにしたほうがよい場合があります。 Gforth は、こ​​の目的のためにいくつかのレベルのアサートを提供します:

assert0( ( ) gforth-0.2 “assert-zero”

常にオンにする必要がある重要なアサート。

assert1( ( ) gforth-0.2 “assert-one”

通常のアサート: デフォルトではオンになっています。

assert2( ( ) gforth-0.2 “assert-two”

デバッグ用のアサート。

assert3( ( ) gforth-0.2 “assert-three”

通常のデバッグでは有効にしたくないであろう遅いアサート。 主に徹底的なチェックを行うためにオンにします。

assert( ( ) gforth-0.2 “assert(”

assert1( と同等です

) ( ) gforth-0.2 “close-paren”

アサートを終了します。 汎用の終端なので、 他の同様の目的でも使用されます

変数 assert-level は、オンにする最高のアサートを指定します。 つまり、デフォルトの assert-level の 1 では、 assert0( および assert1( はチェックを実行しますが、 assert2( および assert3() はコメントとして扱われます。

assert-level の値は、 実行時ではなくコンパイル時に評価されます。 したがって、 実行時にアサートをオンまたはオフにすることはできません。 あなたはコードをコンパイルする前に assert-level を適切に設定する必要があります。 異なるコード部分を異なる assert-level でコンパイルできます(例: 信頼に足るライブラリはレベル 1 で、 新しく作成されたコードはレベル 3 など)。

assert-level ( – a-addr  ) gforth-0.2 “assert-level”

変数(variable)。 指定のレベルを超えるすべてのアサートはオフになります。

アサートが失敗すると、 Emacs のコンパイル・モードと互換性のあるメッセージが生成され、 実行が中止(abort)されます(現在は ABORT" を使用します。 あなたの興味があれば、 特別な throw コードを導入します。 ただし、 特定の条件をキャッチ(catch)したい場合は、 おそらくアサートよりも throw を使用する方が適切です)。

アサート (および ~~) の出現後に同じファイル内で marker が実行されると、 通常は間違ったファイル名が出力されます。 アサート (および ~~) の出現前に同じファイル内で marker が実行された場合、 ファイル名として「どれか」(somewhere)が出力されます。

これらのアサート・ワードの標準 Forth での定義は、 compat/assert.fs で提供されます。


Next: Singlestep Debugger, Previous: Debugging, Up: Programming Tools   [Contents][Index]