Next: , Previous: , Up: Tokens for Words   [Contents][Index]


6.12.1 Execution token

実行トークン(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”

xtname のインタプリタ機能(interpretation semantics)を表します。 ワードにインタプリタ機能が無い場合、 -14 throw を実行します。

['] ( compilation. "name" – ; run-time. – xt  ) core “bracket-tick”

xtname のインタプリタ機能(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”

Footnotes

(21)

標準 Forth には、 インタプリタ機能(interpretation semantics)が未定義のワード(例: r@)や、 定義された実行機能(execution semantics)が無いワード(例: s")や、 およびそのどちらも持たないワード(例: if)があります。 ただし、 インタプリタ機能(interpretation semantics)と実行機能(execution semantics)の両方が定義されている場合、 それらは同一でであるため、 それらを同一のものとして扱います


Next: Name token, Previous: Tokens for Words, Up: Tokens for Words   [Contents][Index]