Next: Stacks, postfix notation and parameter passing, Previous: An Introduction to Standard Forth, Up: An Introduction to Standard Forth [Contents][Index]
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 より優先される