Next: , Previous: , Up: Forth Words   [Contents][Index]


6.15 The Input Stream

テキスト・インタプリタは、 複数のソース(see Input Sources)が利用可能な入力ストリームから読み取ります。 いくつかのワード、特に定義ワードや ' のようなワードは、 スタックからではなく入力ストリームからパラメータを読み込みます。

このようなワードは入力ストリームをパース(parse)するため、 パース・ワードと呼ばれます。 パース・ワードの使用は困難です。 なぜならプログラムで生成されたパラメーターを入力ストリームを通じて渡すのが難しいからです。 また、 素朴な実装をすると、 インタプリタ機能(interpretation semantics)とコンパイル機能(compilation semantics)の組み合わせが直感的でないことが多く、 より直感的な振る舞いを実現しようとする様々なアプローチが生まれています(see Combined Words)。

ワードをパースするのは悪い考えであることは、 最早明らかです。 あなたが、 利便性のためにパース・ワードを実装したいなら、 非パースのバリエーション、 つまり、 パースを行わずスタック上のパラメータを受け取るワードも提供してください。 もし、 その上でパース・ワードを実装するなら、 以下のワード群を使用できます:

parse ( xchar "ccc<xchar>" – c-addr u  ) core-ext,xchar-ext “parse”

パース領域で xchar で区切られた ccc をパースします。 c-addr u は、 パース領域内でパースされた文字列を指します。 パース領域が空の場合、 u は 0 です(訳注: bl parse ccc type ccc ok 。 直後でENTERキーを押して行を終了すると(parse ENTER)、 長さ0の文字列をスタックに積む)

string-parse ( c-addr1 u1 "ccc<string>" – c-addr2 u2  ) gforth-1.0 “string-parse”

文字列 c-addr1 u1 で区切られた ccc をパース領域でパースします。 c-addr2 u2 は、 パース領域内のパースされた文字列を指します。 パース領域が空の場合、 u2 は 0 です(訳注: " " string-parse ccc type ccc ok)

parse-name ( "name" – c-addr u  ) core-ext “parse-name”

入力バッファーから次の単語(word)を取得します(訳注: parse-name ccc type ccc ok)

parse-word ( – c-addr u  ) gforth-obsolete “parse-word”

parse-name の古い名前。 このワード語は、他の一部のシステムでは矛盾する振る舞いをします。

name ( – c-addr u  ) gforth-obsolete “name”

parse-name の古い名前

word ( char "<chars>ccc<char>– c-addr  ) core “word”

先頭の区切り文字をスキップします。 パース領域で char で区切られた ccc をパースします。 c-addr は、 カウンタ付き文字列形式で、 パースされた文字列を格納する一時領域のアドレスです。 パース領域が空であるか、 区切り文字以外の文字が含まれてい無い場合、 結果の文字列の長さはゼロになります。 プログラムは、 カウンタ付き文字列内の文字を置き換える場合があります。 時代遅れ(OBSOLESCENT): カウンタ付き文字列の末尾に、 その長さに含まれないスペースがあります。

refill ( – flag  ) core-ext,block-ext,file-ext “refill”

入力ソースにより入力バッファーを満たすことを試みます。 入力ソースがユーザー入力デバイスの場合、 端末入力デバイスからの入力の受け取りを試みます。 成功した場合は、 結果を入力バッファーにし、 >IN を 0 に設定して true を返します。 それ以外の場合は false を返します。 入力ソースがブロックの場合、 BLK の値に 1 を加算して、 次のブロックを入力ソースかつ現在の入力バッファーにし、 >IN を 0 に設定します。 BLK の新しい値が有効なブロック番号の場合は true を返し、 それ以外の場合は false を返します。 入力ソースがテキスト・ファイルの場合、 ファイルから次の行を読み取ろうと試みます。 成功した場合は、 結果を現在の入力バッファーにし、 >IN を 0 に設定して true を返します。 それ以外の場合は false を返します。 いずれの場合も、 成功した結果には、0 文字を含む行の受け取りが含まれます。

非パースなバリエーションが無いパース・ワードを取り扱う必要がある場合、 execute-parsing を使用して(スタック経由で)文字列を渡すことができます:

execute-parsing ( ... addr u xt – ...  ) gforth-0.6 “execute-parsing”

addr u を現在の入力ソースにして xt ( ... -- ... ) を実行してから、 以前の入力ソースを復元します。

Example:

5 s" foo" ' constant execute-parsing
\ これは、以下と同等です
5 constant foo

標準 Forth でのこのワードの定義は compat/execute-parsing.fs で提供されます。

ファイルに対してワードのパースを実行したい場合は、 以下のワードが役に立ちます:

execute-parsing-file ( i*x fileid xt – j*x  ) gforth-0.6 “execute-parsing-file”

fileid を現在の入力ソースにして、 xt ( i*x -- j*x ) を実行してから、 以前の入力ソースを復元します。


Next: Word Lists, Previous: The Text Interpreter, Up: Forth Words   [Contents][Index]