辞書には用意されているすべての Forth ワードが含まれています。ワード定義を使って新しい Forth コマンドを作成します。
ワード定義は 2 つのスタックダイアグラムを必要とします。最初のダイアグラムでは、新しいワードを作成するときのスタック効果を示します。2 番目の (E:) ダイアグラムはそのコマンドが後で実行されるときのスタック効果を示します。
表 4-14 に新しい Forth ワードを作成するためのワード定義を示します。
作成辞書への登録ある Forth コマンドが既存のコマンドと同じ名前で作成されると、新しいコマンドが正常に作成されます。実装によっては 「new-name isn't unique」 というメッセージが表示されます。そのコマンドの以前の使用方法は、影響を受けません。そのコマンド名をそのあとに使用する場合、最新の定義を使用します。コマンド名の同じものはすべて同じ動作をするようにするには、patch を使用して修正してください。( 「patch と (patch)の使用方法」を参照してください。)
表 4-14 ワード定義
コマンド |
スタックダイアグラム |
説明 |
---|---|---|
: name |
( -- ) (E: ... -- ??? ) |
新しいコロン定義の作成を開始します。 |
; |
( -- ) |
新しいコロン定義の作成を終了します。 |
alias new-name old-name |
( -- ) (E: ... -- ??? ) |
old-name と同じ操作をする new-name を作成します。 |
buffer: name |
( size -- ) (E: -- a-addr ) |
指定されたデータバッファーを作成します。name は a-addr を返します。 |
constant name |
( x -- ) (E: -- x ) |
定数 (たとえば、3 constant bar) を作成します。 |
2constant name |
( x1 x2 -- ) (E: -- x1 x2 ) |
2 つの数値の定数を作成します。 |
create name |
( -- ) (E: -- a-addr ) |
別のコマンドにより設定される動作を行う新しいコマンドを作成します。 |
$create |
( name-str name-len -- ) |
name-string によって指定される名前を使用して create を実行します。 |
defer name |
( -- ) (E: ... -- ??? ) |
別の動作を行うコマンドを作成します。to で変更します。 |
does> |
( ... -- ... a-addr ) (E: ... -- ??? ) |
create で作成されたワードの実行時の動作を指定します。 |
field name |
( offset size -- offset+size ) (E: addr -- addr+offset ) |
指定された name でフィールドオフセットポインタを作成します。 |
struct |
( -- 0 ) |
struct...field 定義を開始します。 |
value name |
( x -- ) (E: -- x ) |
指定された変数を作成します。to で変更します。 |
variable name |
( -- ) (E: -- a-addr ) |
指定された変数を作成します。name は a-addr を返します。 |
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 |