辞書には用意されているすべての Forth ワードが含まれています。ワード定義を使って新しい Forth コマンドを作成します。
ワード定義は 2 つのスタックダイアグラムを必要とします。最初のダイアグラムでは、新しいワードを作成するときのスタック効果を示します。2 番目の (E:) ダイアグラムはそのコマンドが後で実行されるときのスタック効果を示します。
表 4-14に新しい Forth ワードを作成するためのワード定義を示します。
ある Forth コマンドが既存のコマンドと同じ名前で作成されると、新しいコマンドが正常に作成されます。実装によっては 「new-name isn't unique」 というメッセージが表示されます。そのコマンドの以前の使用方法は、影響を受けません。そのコマンド名をそのあとに使用する場合、最新の定義を使用します。コマンド名の同じものはすべて同じ動作をするようにするには、patch を使用して修正してください。(「patch と(patch) の使用方法」を参照してください。)
表 4-14 ワード定義
value では名前に変更可能な任意の数値を付けることができます。その名前を後で実行すると、その代入値がスタックに残されます。次の例は 22 という初期値を foo という名前のワードに代入し、次に foo を呼び出してその代入値を演算に使用します。
ok 22 value foo ok foo 3 + . 25 ok |
値は to で変更できます。たとえば、次の例を参照してください。
ok 43 value thisval ok thisval . 43 ok 10 to thisval ok thisval . 10 ok |
value を使用して作成したワードは、値が必要な場合、@ を使用しないで済むので便利です。
ワード定義 variable は 1 セルのメモリー領域に名前を割り当てます。この領域は必要に応じて値の保存用として使用できます。後でその名前を実行すると、領域のメモリーアドレスがスタックに残されます。そのアドレスの読み書きには @ と ! が使用されます。次の例を参照してください。
ok variable bar ok 33 bar ! ok bar @ 2 + . 35 ok |
ワード定義 defer により、異なる機能を読み込むスロットが生成され、後で機能を変更できるワードを生成することができます。次の例を参照してください。
ok hex ok defer printit ok ['] .d to printit ok ff printit 255 ok : myprint (n -- ) ." It is " .h ] ." in hex " ; ok ['] myprint to printit ok ff printit It is ff in hex ok |