ここで使用される用語は、 間接スレッド 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, (一般コンパイル)メソッドが使用されます)。