テキスト・インタープリターは、 複数のソース(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 )
を実行してから、
以前の入力ソースを復元します。