OpenBoot 2.x コマンド・リファレンスマニュアル

ワード定義の使用方法

辞書には用意されているすべての Forth コマンドが含まれています。ワード定義を使って新しい Forth コマンドを作成します。

ワード定義は 2 つのスタックダイアグラムを必要とします。最初のダイアグラムでは、新しいコマンドを作成するときのスタック効果を示します。第 2番目の (Usage:) ダイアグラムはそのコマンドが後で実行されるときのスタック効果を示します。

表 4-7 に辞書エントリを作成するためのワード定義を示します。

表 4-7 ワード定義

コマンド 

スタックダイアグラム 

説明 

: name

( -- )  

Usage: ( ??? -- ? ) 

新しいコロン定義の作成を開始します。 

;

( -- ) 

新しいコロン定義の作成を終了します。 

alias new-name old-name

( -- )  

Usage: ( ??? -- ? ) 

old-name と同じ操作をする new-name を作成します。

buffer: name

( size -- )  

Usage: ( -- a-addr )  

指定された配列を一時記憶領域に作成します。 

constant name

( n -- )  

Usage: ( -- n )  

定数 (たとえば、 3 constant bar)を定義します。

2constant name

( n1 n2 -- )  

Usage: ( -- n1 n2 )  

2 つの数値の定数を定義します。 

create name

( -- )  

Usage: ( -- waddr )  

汎用ワード定義。 

defer name

( -- )  

Usage: ( ??? -- ? )  

フォワードリファレンス、または実行トークンを使用する実行ベクトル用のワードを定義します。 

does>

( -- waddr )  

ワード定義のための実行時の節を開始します。 

field name

( offset size -- offset+size )  

Usage: ( addr -- addr+offset ) 

指定されたオフセットポインタを作成します。 

struct

( -- 0 ) 

field の作成に備えて初期化します。

value name

( n -- )  

Usage: ( -- n )  

指定された、変更可能な 32 ビットの数値を作成します。 

variable name

( -- )  

Usage: ( -- waddr )  

変数を定義します。 

ワード定義 constant を使用して、値が変わらない名前を作成できます。単純なコロン定義 : foo 22 ; でも同じ結果になります。


ok 72 constant red 
ok
ok red . 
72
ok 

value では任意の数値に名前を付けることができます。その名前を後で実行すると、その代入値がスタックに残されます。次の例は 22 という値を foo という名前のワードに代入し、次に foo を呼び出してその代入値を演算に使用します。


ok 22 value foo
ok foo 3 + .
25
ok 

値は辞書コンパイルワード is で変更できます。たとえば、次の例を参照してください。


ok 43 value thisval
ok thisval .
43
ok 10 to thisval
ok thisval .
10
ok 

value を使用して作成したコマンドは、数値が必要な場合、@ を使用しないで済むので便利です。

ワード定義 variable は 32 ビットのメモリー領域に名前を割り当てます。この領域は必要に応じて値の保存用として使用できます。後でその名前を実行すると、領域のメモリーアドレスがスタックに残されます。一般的に、そのアドレスの読み書きには @! が使用されます。次の例を参照してください。


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