Next: , Previous: , Up: The Core Words   [Contents][Index]


9.1.2 Ambiguous conditions

ワードでも数字でもない名前:

-13 throw (Undefined word)

定義名が許可される最大長を超えています:

-19 throw (Word name too long)

forth システムのさまざまなデータ空間内で無い領域をアドレス指定しようとした:

スタックやコード・スペースやヘッダー・スペースはアクセス可能です。 マシン・コード空間は通常、読み取り可能です。 他のアドレスにアクセスすると、 オペレーティング・システムに応じた結果が得られます。 まともなシステムの場合: -9 throw (Invalid memory address)

引数の型がパラメータと互換性がありません:

これは通常はキャッチされません。 一部のワード(制御フロー・ワードなど)はチェックを実行し、 ABORT" または -12 THROW (Argument type mismatch) となります。

実行機能(execution semantics)が未定義であるワードの実行トークンを取得しようとしています:

実行トークンは、 ワードのインタプリタ機能(interpretation semantics)を表します。 Gforth はすべてのワードのインタプリタ機能を定義します。 標準でインタプリタ機能が定義されていないが、 実行機能(execution semantics)が定義されているワード(LEAVE を除く)については、 インタプリタ機能が実行機能を実行します。 標準でインタプリタ機能が定義されていないが、 コンパイル機能(compilation semantics)(および LEAVE)が定義されているワードの場合、 インタプリタ機能はコンパイル機能を実行します。 一部の単語はコンパイル専用(compile-only)としてマークされており、 ' はこれらのワードに対して警告を出します。

ゼロ除算:

一部のプラットフォームでは、 これにより -10 throw (Division by zero) が生成されます。 他のシステムでは、 通常、 これにより -55 throw (Floating-point unidentified fault) が生成されます。

データ・スタックのスペースまたはリターン・スタックのスペースが不十分:

オペレーティング・システムやインストール時の設定や Gforth の起動時の設定に応じて、 これはメモリ管理ハードウェアによって、 チェックされたり、チェックされなかったり。 これがチェックされている場合、 通常はオーバーフローが発生するするやいなや、 (プラットフォームとオーバーフローを達成した方法によって異なりますが、) -3 throw (Stack overflow) または -5 throw (Return stack overflow) または -9 throw (Invalid memory address) を受け取ります。 これがチェックされていない場合、 オーバーフローは通常、 原因不明の不正なメモリ・アクセスを引き起こし、 -9 throw (Invalid memory address) または -23 throw (Address alignment exception) を生成します。 また、ALLOCATE とそのファミリーの内部データ構造も破壊し、 これらのワードにさまざまなエラーが発生する可能性があります。

ループ制御パラメータ用のスペース不足:

他のリターン・スタック・オーバーフローと同様。

ディクショナリのスペースが不足:

ディクショナリで利用可能なメモリを超えるメモリを(allot で直接、 または ,create などで間接的に)割り当てようとすると、 -8 throw (Dictionary overflow) が発生します。 ディクショナリの末尾を超えてメモリにアクセスしようとすると、 結果はスタック・オーバーフローと同様になります。

未定義のインタプリタ機能(interpretation semantics)でワードを解釈(interpret):

Gforth は全てのワードのインタプリタ機能(interpretation semantics)を定義します。 標準で実行機能(execution semantics)が定義されているワード(LEAVE を除く)については、 インタプリタ機能が実行機能を実行します。 標準ではインタプリタ機能が定義されていないが、 コンパイル機能(compilation semantics)(および LEAVE)が定義されているワードの場合、 インタプリタ機能はコンパイル機能。 一部のワードはコンパイル専用(compile-only)としてマークされており、 テキスト解釈(text-interpreting)すると警告が表示されます。

入力バッファまたは文字列リテラルの内容を変更:

これらは書き込み可能なメモリに配置されており、 変更することができます。

表示数値出力文字列(pictured numeric output string)のオーバーフロー:

-17 throw (Pictured numeric ouput string overflow)

パースする文字列のオーバーフロー:

PARSE はオーバーフロー不可能です。 WORD はオーバーフローをチェックしません。

範囲外の結果の生成:

2 の補数マシンでは、 1倍長演算の場合は 2**bits-per-cell 、2倍長演算の場合は 4**bits-per-cell を法(modulo)として演算が実行されます(符号付き型は適切なマッピングを使用)。 ゼロ除算は通常、-10 throw (divide by zero) または -55 throw (floating point unidentified fault) を引き起こします。 除算のオーバーフローにより、 -10 throw (divide by zero) または -55 throw (floating point unidentified fault) が発生したり、 -11 throw (result out of range) が発生したりする可能性があります。 Gforth-fast エンジン(訳注: OSコマンドラインから Gforth-fast で起動)では、 除算のオーバーフローまたはゼロによる除算の際に、 暗黙的に偽の結果を生成する可能性があります。 Convert>number は現在、 何も警告を出さずにオーバーフローします。

空のデータ・スタックまたは空のリターン・スタックからの読み取り:

データ・スタックは、 各ワード execute 後、 外部インタプリタ(別名 テキスト・インタプリタ)によってチェックされます。 アンダーフローした場合は、 -4 throw (Stack underflow) が発出されます。 それとは別に、 オペレーティング・システムやインストール時の設定や(OSからの gforth)起動時の設定に応じて、 スタックがチェックされるかどうかが異なります。 チェックで検出された場合、 通常は、プラットフォームや、 どのスタックがどの程度アンダーフローしたかに応じて、 通常は -4 throw (Stack underflow) または -6 throw (Return stack underflow) または -9 throw (Invalid memory address) が発生します。 注意: システムが(MMU を介した)チェックを使用している場合でも、 リアクションをトリガーするには、 プログラムがかなりの数のスタック項目をアンダーフローする必要がある場合があることに注意してください(その理由は、 MMU 絡みチェックがページ・サイズの粒度で動作するためです)。 チェックが行われない場合、アンダーフローによる症状はオーバーフローによる症状と似ています。 アンバランスなリターン スタック エラーは -9 throw (Invalid memory address) や不正な命令(通常は -260 throw)など、さまざまな症状を引き起こす可能性があります。

予期せず入力バッファの終わりに達したため、 長さ 0 の文字列を名前として使用しようとした:

Create とその子孫は -16 throw (Attempt to use zero-length string as a name;長さ 0 の文字列を名前として使用しようとします)を発出します。 ' のようなワードは検索しても見つからない可能性があります。 注意: nextname を使用して長さゼロの名前を作成できることに注意してください(ホントにそうすべきかどうかをよく確認してください)。

>IN が指し示す値が入力バッファの長さより大きい:

次にパース・ワードを呼び出すと、 長さ 0 の文字列が返されます。

RECURSEDOES> の後に現れた:

DOES> の後のコードへの再帰呼び出しをコンパイルします。

RESTORE-INPUT の引数の入力ソースが現在の入力ソースと異なります:

-12 THROW 注意: 入力ファイルが閉じられると(たとえば、 ファイルの終わりに達したため、 その source-id は再利用される可能性があることに注意してください。 したがって、 閉じられたファイルを参照する入力ソース仕様(input source specification)を復元(restore)すると、 -12 THROW ではなく、 予期しない結果が発生する可能性があります。

将来的には、 Gforth は現在の入力ソース以外から入力ソースの仕様を復元(input source specifications)できるようになる可能性があります。

定義を含むデータス・ペースの割り当てを解除:

allot による割り当て解除はチェックされません。 これにより、通常、 メモリ・アクセス・フォールト(memory access faults)や不正な命令の実行(execution of illegal instructions)が発生します。

不正なアライメント(alignment)によるデータ空間の 読み取り/書き込み:

プロセッサに依存します。 通常、 -23 throw (Address alignment exception) が発生します。 アライメントがオンになっている 486 以降のプロセッサ上の Linux-Intel では、 アライメントが正しくないと -9 throw (Invalid memory address) が発生します。 報告によると、 アライメント制限があるのに違反を報告しない一部のプロセッサがあるとのことです。

データ空間ポインタが正しくアライメントされていない ,, C,:

他のアライメント・エラーと同様。

u+2 未満のスタック項目で PICK および ROLL を実行:

他のスタック・アンダーフローと同様。

ループ制御パラメータが無効:

チェックされていません。 カウンタ付きループのワード群は、 リターン・スタック項目の先頭がループ制御パラメータであると単純に想定し、 それに応じて動作します。

最新の定義は名前を持っていません(IMMEDIATE):

abort" last word was headerless".

TO で使用される VALUE で名前が定義されていません:

-32 throw (Invalid name argument) (名前がローカル変数であるか、 CONSTANT によって定義されている場合を除きます。 後者の場合は、 定数が変更されるだけです)。

名前が見つかりません(', POSTPONE, ['], [COMPILE]):

-13 throw (Undefined word)

パラメータが同じ型(type)ではありません(DO, ?DO, WITHIN):

Gforth は、 それらが同じタイプであるかのように振る舞います。 つまり、 あなたは、 すべてのパラメータを符号付きなどとして解釈することで、振る舞いを予測できます。

POSTPONE または [COMPILE]TO に適用されました:

: X POSTPONE TO ; IMMEDIATE と仮定します。 XTO のコンパイル機能(compilation semantics)を実行します。

WORD によって返されるカウンタ付き文字列よりも長い文字列:

チェックされていません。 文字列は問題ありませんが、 当然ながら、 そのカウントにはその長さの最下位ビット達のみが含まれます。

指定の u がセル内のビット数以上(LSHIFTRSHIFT):

プロセッサに依存します。 一般的な振る舞いは、 0 を返し、 シフト・カウントの下位ビット達のみを使用することです。

CREATE によって定義されたワードではない:

>BODY は、 ワードの定義方法に関係なく、 ワードの PFA を生成します。

DOES> は、 定義方法に関係なく、 最後に定義されたワードの実行機能(execution semantics)を変更します。 たとえば、 CONSTANT DOES>CREATE , DOES> と同等です。

<##> の外で不適切に使用されているワード:

チェックされていません。 いつものように、 メモリ障害が発生することが予想されます。


Next: Other system documentation, Previous: 実装毎オプション(Implementation Defined Options;idef), Up: The Core Words   [Contents][Index]