実行トークン(execution token)(xt)はワードの振る舞いを表します。 execute を使用して
xt で表される振る舞いを呼び出すことができ、 そして、 compile, (see Macros)
を使用してそれを現在の定義にコンパイルできます。 その他の使用法としては、 defer された ワード(see Deferred Words)
があります。
特に、 ワードのインタープリター機能(interpretation semantics)(別名 実行機能(execution semantics))を表す「実行トークン」(execution token)があります21。
名前付きワード x の場合、
`x(訳注:アポストロフィではなくてバックスラッシュ)を使用してその実行トークンを取得できます:
5 `. ( n xt ) execute ( ) \ execute the xt (i.e., ".") : foo `. execute ; 5 foo
しかしながら、 ` プレフィックスは Gforth 拡張であるため、 以下の標準 Forth のワードを使用する方が好ましいです:
' ( "name" – xt ) core “tick”
xt は name のインタープリター機能(interpretation semantics)を表します。
ワードにインタープリター機能が無い場合、 -14 throw を実行します。
['] ( compilation. "name" – ; run-time. – xt ) core “bracket-tick”
xt は name のインタープリター機能(interpretation semantics)を表します。
ワードにインタープリター機能が無い場合、 -14 throw を実行します。
これらはパース・ワード(parsing words)であるため(なお、 `x
は認識器(recognizer)によってリテラルとして扱われます)、
通訳(interpret)されたりコンパイルされたコードの振る舞いが直感的ではない場合があります:
5 ' . ( n xt ) execute ( -- ) \ execute the xt of . \ 以下は意図したとおりに動きません: \ : foo ' . ; \ 5 foo execute \ その代わりに以下のようにします: : foo ['] . ; 5 foo execute \ execute the xt of . \ コロン定義内で ' を使った場合: : bar ' execute ; 5 bar . \ execute the xt of . \ 訳注: 一見普段と変わらないように見えるが、 \ テキスト・インタープリターが . を実行するのではなく、 \ bar が その後ろのワードの xt を execute している。 \ よって bar の後ろを省略すると下記のようにエラーとなる 5 bar *the terminal*:10:6: error: Attempt to use zero-length string as a name 5 bar>>><<<
' は実行時にパースするため、 bar のようにコロン定義に置くと、
コロン定義内の次のワードを消費せずに実行時に次のワードが消費されます。 `x と書かずにリテラル xt
をコロン定義に入れたい場合は、 ['] x と書きます。
Gforth の `x や ' や ['] は、 compile-only
ワードで使用すると警告(warn)します。 そのような使用法が、 異なる Forth システム間で移植できない可能性があるためです。
ワードの immediate のバリエーションを定義することで、 この警告(warning)と移植性の問題を回避できます。 例:
: if postpone if ; immediate : test [ ' if execute ] ." test" then ;
結果として得られる実行トークンが execute されたときは、 if のコンパイル機能(compilation
semantics)を実行します。
xt を取得するもう一つ方法は、 :noname または latestxt です(see Anonymous Definitions)。 匿名のワードの場合、 :noname または latestxt により、
そのワードが持つ唯一の振る舞い(実行機能(execution semantics)) の xt が得られますが、 名前付きワードの定義の後ろで
latestxt を使用して、 その xt を取得することもできます。
:noname ." hello" ; execute
xt は 1 つのセルを占有し、 他のセルと同様に操作できます。
標準 Forth では、 xt は単なる抽象データ型です(つまり、 xt を生成または消費する操作によって定義されます)。 (Gforth 1.0 以降の)具体的な実装は、 ワードの本体アドレス(昔は PFA だった)です。 Gforth 0.7 以前では、 xt はコード・フィールド・アドレス(CFA は PFA の 2 セル前)として実装されていました。
execute ( xt – ) core “execute”
実行トークン xt によって表される機能(semantics)を実行します。
execute-exit ( compilation – ; run-time xt nest-sys – ) gforth-1.0 “execute-exit”
xt を実行し、 末尾呼び出し最適化法(tail-call-optimized way)で現在の定義から戻ります。 戻りアドレス
nest-sys とローカル変数(local)は、 xt を execute
する前に割り当て解除(deallocate)されます。
perform ( a-addr – ) gforth-0.2 “perform”
@ execute.
Noop は、 しばしば実行トークンのプレースホルダーとして使用されます:
noop ( – ) gforth-0.2 “noop”
標準 Forth には、
インタープリター機能(interpretation semantics)が未定義のワード(例: r@)や、
定義された実行機能(execution semantics)が無いワード(例: s")や、 およびそのどちらも持たないワード(例:
if)があります。 ただし、 インタープリター機能(interpretation semantics)と実行機能(execution
semantics)の両方が定義されている場合、 それらは同一でであるため、 それらを同一のものとして扱います