Forth イメージを呼び出すと、 起動バナーが出力されますが、 他には何も表示されません (システムに Gforth がインストールされている場合は、 gforthRET と入力して今すぐ呼び出してみてください)。 今、 Forth は、 テキスト・インタープリター(Text Interpreter)と呼ばれるコマンド・ライン・インタプリタを実行しています(外部インタープリターとも呼ばれます;訳注: 別途存在する 内部インタープリター(inner interpreter)に対してこう呼ばれる)。 (この章を読み進ればテキスト・インタープリターについて多くのことを学ぶことができます。 詳細については see The Text Interpreter を参照してください)。
明白ではなくて分かりにくいですが、 今や Forth はユーザーの入力を待っています。 数字の 4 と 5 を入力し RET キーを押します:
45RET ok
テキスト・インタープリターは、 次の入力を促すプロンプトを表示するのではなく、 入力行を処理した後に(改行無しで)ステータス・メッセージを出力します。
この場合のステータス・メッセージ(RET (「エンター」(リターン)キー押下)の後の ok
)は、
テキスト・インタープリターがすべての入力を正常に処理できたことを示します。 それでは次に、 不正な文字列を入力してみましょう:
qwer341RET *the terminal*:2: Undefined word >>>qwer341<<< Backtrace: $2A95B42A20 throw $2A95B57FB8 no.extensions
‘Undefined word‘ 以外の文章はシステムによって若干異なる場合がありますが、 意味は同じです。 テキスト・インタープリターがエラーを検出すると、 行に残っているテキストを破棄し、 特定の内部状態をリセットして、 エラー・メッセージを出力します。 エラー・メッセージの詳細な説明については、 Error messages を参照してください。
テキスト・インタープリターは、エンター・キー(リターン・キー)が押されるのを待ち、 その後入力行を処理します。 行頭から開始して、 行をスペースで区切られた文字のグループに分割します。 文字のグループごとに、 以下の順番で、 何かするために計 2 回の試みを行います:
テキスト・インタープリターが文字グループに対して上記のいずれも実行不可能な場合、 その文字グループと行の残りの部分が破棄され、
エラー・メッセージが出力されます。 テキスト・インタープリターがエラーなく行末に到達すると、 ステータス・メッセージ ok
に続いて改行を出力します。
以下は、 テキスト・インタープリターに与えることができる最もシンプルなコマンドです:
RET ok
ここで、 テキスト・インタープリターは、 私たちが要求したことをすべて(何もせずに)エラーなしで実行したため、 すべてが ok
であると表示しました。 今度は少し長いコマンドを試して見ましょう:
12 dup fred dupRET *the terminal*:3: Undefined word 12 dup >>>fred<<< dup Backtrace: $2A95B42A20 throw $2A95B57FB8 no.extensions
エンター・キー(リターン・キー)を押すと、 テキスト・インタープリターが行に沿って動作を開始します:
2
の後のスペースに到達すると、 文字グループ 12
を取得し、
それらを名前ディクショナリーで検索します5。
名前ディクショナリにはこの文字グループに一致するものがないため、それらを数値として処理しようとし、 そして、
数値として処理するのは正常に実行できたので、 (それが何を意味するにせよ) 数値 12 を「スタック上」に置きます。
dup
を実行します(それが何を意味していても)。
fred
を取得します。
名前ディクショナリーで調べますが、見つかりません。 それらを数値として扱おうとしますが、 正当な数値を表すものではありませんでした。
この時点で、 テキスト・インタープリターは諦めてエラー・メッセージを出力します。 エラー・メッセージには、
テキスト・インタープリターが行の処理でどこまで到達したかが正確に示されます。 これは、 特に、 テキスト・インタープリターが最後の文字グループ
dup
に対して何も行おうとしなかったことを示しています。 テキスト・インタプリタがそのワード dup
を検索して、
一度はちゃんと実行されたのですから、 もう一度実行することに何の問題はないはずなのに、 です。
見つかったかどうかはわかりませんが、いまのところ、 見つからなかったと仮定します。 訳注: 12 というワードを定義することもでき、その場合はワード 12 の方が数値 12 より優先される