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 の部分) というマクロに、
全体をきちんとパッケージ化しています。