特にメンテナンス中に無効になる可能性があると仮定する場合(たとえば、 データ構造の特定のフィールドは決してゼロにならない、 等)、 プログラムを自己チェックするようにすることをお勧めします。 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 で提供されます。