付録A Forth概観(初心者向け)

辞書(dictionary)

Forthはワード(および数値)で表され、空白で区切られています。

HAND OPEN  ARM LOWER  HAND CLOSE  ARM RAISE

そのようなコマンドはキーボードから直接タイプするか、または大容量記憶装置で編集してから LOAD します。

システムに含まれているかユーザ定義であるかにかかわらず、すべてのワードは「辞書(dictionary)」(リンクリスト)に存在します。「定義ワード」は、辞書に新しい名前を追加するために使用されます。 定義ワードの1つに : (「コロン」と発音)があります。これは、以前に定義されたワードを使って新しいワードを定義するために使用されます。 LIFT という新しいワードを定義する方法は次のとおりです。

: LIFT   HAND OPEN  ARM LOWER  HAND CLOSE  ARM RAISE ;

; は定義を終了させます。 その定義を構成する長い一連のワードの代わりに、今後は新しいワード LIFT を使用することができます。

Forthのワードは、このように無限に入れ子にできます。 Forthアプリケーションを書くことは、以前に定義されたものに関して、このようなますます強力な定義を構築することです。

もう1つの定義ワードは CODE です。これはコロンの代わりに使用され、ネイティブプロセッサ用の機械語命令でコマンドを定義します。 CODE で定義されたワードは、コロンで定義されたワードとユーザには区別できません。 CODE 定義は、あるとしてもアプリケーションの中で最も実行時間的にクリティカルな部分にのみ必要です。

データ構造

さらに別の定義ワードは CONSTANT (訳注:定数の意)で、これは次のように使用されます。

17 CONSTANT SEVENTEEN

実際の数17の代わりに新しいワード SEVENTEEN を使用することができます。

定義ワード VARIABLE (訳注:変数の意)は一時データ用の場所を作成します。 VARIABLE は次のように使われます。

VARIABLE BANANAS

これは BANANAS という名前で識別される場所を予約します。

この場所の内容を取得するのは、ワード @ (フェッチと発音)の仕事です。 例えば、次の通りです。

BANANAS @

このようにして変数 BANANAS の内容を取得します。 その反対は ! (ストアと発音)で、値をその場所に格納します。

100 BANANAS !

Forthは現在の値を与えられた値で増加させるワードも提供します。 たとえば次のフレーズです。

2 BANANAS +!

(先程 BANANA の格納場所に入れた数値100に)2を加え、102にします。

Forthは他にも多くのデータ構造演算子を提供しますが、さらに重要なことには、アプリケーションに必要なあらゆるタイプのデータ構造を作成するためにプログラマに必要なツールを提供します。

スタック

Forthでは、変数や配列は、他の多くのルーチンが必要とする可能性がある値や予期しないときに値を保存するために使用されます。 それらは定義間でのデータのローカルな受け渡しには使われません。 そのためには、Forthはもっと単純なメカニズムを採用しています。それはデータ・スタックです。

数値を入力すると、それはスタックに置かれます。 あなたが数値入力のあるワードを呼び出すとき、それはスタックからそれを取ります。 したがって以下のフレーズ

17 SPACES

これは、現在の出力デバイスに17個の空白を出力します。 17 はバイナリ値17をスタックにプッシュします。 SPACES というワードがそれを消費します。

定数もその値をスタックにプッシュします。 したがって、以下のフレーズ

SEVENTEEN SPACES

これは上記と同じ効果が得られます。

スタックは、後入れ先出し(LIFO)方式で動作します。 これは、コロン定義の入れ子と一致して、データが整然としたモジュール形式でワード間で受け渡されることを意味します。

例えば、 GRID と呼ばれる定義はフレーズ 17 SPACES を呼び出すかもしれません。 スタック上のこの一時的な動作は、スタックに置かれた値が GRID の定義が終了する前に削除されるため、 GRID を呼び出す他の定義に対して透過的になります。 呼び出し元の定義は GRID を呼び出す前に自分自身のいくつかの数をスタックに置いたかもしれません。 これらは、 GRID が実行されて呼び出し元の定義が継続するまで、無傷のままスタックに残ります。

制御構造

Forthは、構造化された、GOTO無しのプログラミングに必要なすべての制御構造を提供します。

IF…THEN 構造の構文は以下のとおりです。

... ( フラグ ) IF  KNOCK  THEN  OPEN ...

「フラグ」は、 IF によって消費されるスタック上の値です。 ゼロ以外の値はtrueを示し、ゼロはfalseを示します。 trueのフラグは IF の後のコード(この場合は KNOCK というワード)を実行させます。 ワード THEN は条件付きフレーズの終わりを示します。 実行は OPEN というワードで再開されます。 falseフラグは IFTHEN の間のコードを実行しません。 どちらの場合も、 OPEN が実行されます。

ELSE というワードは、falseの場合に代替フレーズを実行することを可能にします。 以下のフレーズをご覧ください。

( flag ) IF KNOCK  ELSE  RING  THEN  OPEN ...

フラグがtrueならば、ワード KNOCK が実行され、そうでなければワード RING が実行されます。 いずれにせよ、続きの実行は OPEN からになります。

Forthは以下の形でインデックス付きループも提供します。

( limit) ( index) DO ... LOOP

そして不定ループ形式は以下。

... BEGIN  ...  ( flag) UNTIL

... BEGIN  ...  ( flag) WHILE ... REPEAT ;

全般が知りたい場合

Forthコマンドセットの詳細については、Prentice-Hallが発行している Starting Forth を参照してください。(邦訳:「FORTH入門」原 道宏 訳 工学社 昭和59年4月30日 工学社)