GNU C の「ラベルとしての値」の拡張機能(gcc-2.0
以降で有効;see Labels as Values in GNU C Manual)により、 &&label
と書くことにより、
label のアドレスを取得できるようになります。 このアドレスは、 goto *address
のようなステートメントで使用できます。 つまり、 goto *&&x
は goto x
と同じです。
この機能を使用すると、間接スレッド化された NEXT
は以下のようになります:
cfa = *ip++; ca = *cfa; goto *ca;
上記の言葉に馴染みのない人のために説明すると、 ip
は Forth 命令ポインタです。 cfa
(コード・フィールド・アドレス) は標準 Forth の実行トークンに対応するもので次に実行されるワードのコード・フィールドを指します。
そこからフェッチされた ca
(コード・アドレス)は、
プリミティブやコロン定義ハンドラー(docol
)などの実行可能コードを指します。
直接スレッド化はさらに簡単です:
ca = *ip++; goto *ca;
もちろん、 我々は、 NEXT
と NEXT1
(cfa を取得した後の NEXT
の部分) というマクロに、
全体をきちんとパッケージ化しています。