実行トークン(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)の両方が定義されている場合、 それらは同一でであるため、 それらを同一のものとして扱います