ここで使用される用語は、 間接スレッド Forth システム(indirect threaded Forth systems)に由来しています。
間接スレッド Forth システムでは、 ワードの XT はワードの CFA (コード・フィールド・アドレス) によって表されます。 CFA は、
コード・アドレスを含むセルを指します。 コード・アドレスとは、 ワードを呼び出す実行時のアクションを実行するマシン・コードのアドレスです(たとえば、
dovar:
ルーチンは、 ワード(変数)の本体(body)のアドレスをスタックにプッシュします)。
以下のワード群は、 Gforth のコード・フィールドやコード・アドレスやその他のスレッド機能へのアクセスを提供します。 これにより、直接スレッドと間接スレッドの違いは、 多かれ少なかれ抽象化されます。
Gforth 0.7 までは、 ワードの種類を知るのに、 コード・アドレス(さらに、 does>
で定義されたワードの場合は、
>does-code
によって返されるアドレス)で十分でした。 ただし、 Gforth-1.0 以降、 少なくとも、
compile,
や name>compile
のようなワードの振る舞いや実装は、 Header methods
で説明されているように独立して決定できます。
以下のワード達は、 コード・フィールドを作成し、 そして、 同時にヘッダー・メソッドを初期化します:
hmcopy,
( xt – ) gforth-experimental “hmcopy-comma”
ヘッダーの構築中に、 コード・フィールドを割り当て、 コード・フィールドとヘッダー・メソッドを設定するためのプロトタイプとして xt を使用します。
docol,
( – ) gforth-1.0 “docol,”
コロン定義のコード・アドレスを書き込む。
docon,
( – ) gforth-1.0 “docon,”
CONSTANT
のコード・アドレスを書き込む。
dovar,
( – ) gforth-1.0 “dovar,”
CREATE
されたワードのコード・アドレスを書き込む。
douser,
( – ) gforth-1.0 “douser,”
USER
変数のコード・アドレスを書き込む。
dodefer,
( – ) gforth-1.0 “dodefer,”
defer
されたワードのコード・アドレスを書き込む。
dofield,
( – ) gforth-1.0 “dofield,”
field
のコード・アドレスを書き込む。
dovalue,
( – ) gforth-1.0 “dovalue,”
CONSTANT
のコード・アドレスを書き込む。
doabicode,
( – ) gforth-1.0 “doabicode,”
ABI-CODE
定義のコード・アドレスを書き込む。
does>
で定義されたワードの場合、 hmcopy,
を使用してください。
または、 create-from
のような高レベルのワードを使用します(see Creating from a prototype)。
以下のワード群はヘッダー・メソッドが導入される前に設計されたものであるため、 Gforth でさまざまなワード・タイプを処理する最良の(推奨される)方法ではありません。
間接スレッド Forth では、 ' name @
を使用して name のコード・アドレスを取得できます。
Gforth では、 スレッド化方式とは関係なく、 ' name >code-address
で取得できます。
threading-method
( – n ) gforth-0.2 “threading-method”
エンジンが直接スレッドの場合は 0。 注意: これはイメージの存続期間中(lifetime)に変更される可能性があることに注意してください。
>code-address
( xt – c_addr ) gforth-0.2 “>code-address”
c-addr は、 ワード xt のコード・アドレスです。
code-address!
( c_addr xt – ) gforth-obsolete “code-address!”
コード・アドレス c-addr のコード・フィールドを xt に変更します。
さまざまな定義ワードによって生成されるコード・アドレスは、 以下のワード群によって生成されます:
docol:
( – addr ) gforth-0.2 “docol:”
コロン定義のコード・アドレスを書き込む。
docon:
( – addr ) gforth-0.2 “docon:”
CONSTANT
のコード・アドレスを書き込む。
dovar:
( – addr ) gforth-0.2 “dovar:”
CREATE
されたワードのコード・アドレスを書き込む。
douser:
( – addr ) gforth-0.2 “douser:”
USER
変数のコード・アドレスを書き込む。
dodefer:
( – addr ) gforth-0.2 “dodefer:”
defer
されたワードのコード・アドレスを書き込む。
dofield:
( – addr ) gforth-0.2 “dofield:”
field
のコード・アドレスを書き込む。
dovalue:
( – addr ) gforth-0.7 “dovalue:”
CONSTANT
のコード・アドレスを書き込む。
dodoes:
( – addr ) gforth-0.6 “dodoes:”
DOES>
で定義されたワードのコード・アドレス。
doabicode:
( – addr ) gforth-1.0 “doabicode:”
ABI-CODE
定義のコード・アドレスを書き込む。
set-does>
で定義されたワード X の場合、 コード・アドレスは dodoes:
を指し、 そして、
ヘッダー・メソッドの >hmextra
フィールドには、 X の本体(body)アドレスをプッシュした後に呼び出されるワードの
xt が含まれます。
ワードが DOES>
で定義されたワードであるかどうか、 そしてそのワードが execute する Forth
コードを知りたい場合は、>does-code
で以下のことがわかります:
>does-code
( xt1 – xt2 ) gforth-0.2 “>does-code”
xt1 が set-does>
で定義されたワードの子の実行トークンである場合、 xt2 は
set-does>
に渡される xt 、 つまり xt1 実行時に実行されるワードの xt です(ただし、 最初に xt1
の本体(body)アドレスがプッシュされます)。 xt1 が set-does>
で定義されたワードに属していない場合、
xt2 は 0 です。
結果の xt2 を set-does>
(推奨) とともに使用して、 もっとも最新のワードを変更するか以下を使用して変更できます
does-code!
( xt2 xt1 – ) gforth-0.2 “does-code!”
xt1 を xt2 set-does>
で定義されたワードに変更します。
任意のワードを変更するためには…
以下の 2 つのワードは、 >code-address
や >does-code
や
code-address!
や does-code!
を一般化します:
>definer
( xt – definer ) gforth-0.2 “>definer”
definer (definer;定義者)は、 xt の定義方法を示す一意の識別子です。 異なる does>
コードで定義されたワードには、 異なる definer が存在します。 definer は比較や definer!
で使用できます。
definer!
( definer xt – ) gforth-obsolete “definer!”
xt で表されるワードは、 その振る舞いを definer に関連付けられた振る舞いに変更します。
Code-address!
や does-code!
や definer!
は、
opt-compile,
メソッドをそのワード型用のやや汎用的なコンパイラーに更新します(特に、 プリミティブに対しては、
プリミティブ固有の peephole-compile,
(peephole-compile;のぞき穴最適化コンパイル)ではなく、 遅い
general-compile,
(一般コンパイル)メソッドが使用されます)。