付録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フラグは IF
と THEN
の間のコードを実行しません。 どちらの場合も、 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日 工学社)