Next: , Previous: , Up: Forth Tutorial   [Contents][Index]


3.33 POSTPONE

POSTPONE (訳注: (期限が定まってる)延期)を使用すると、 (そのワードのインタプリタ機能(interpretation semantics)をコンパイルする代わりに、) そのワードのコンパイル機能(compilation semantics)をコンパイルできます:

: MY-+ ( Compilation: -- ; Run-time of compiled code: n1 n2 -- n )
 POSTPONE + ; immediate
: foo ( n1 n2 -- n )
 MY-+ ;
1 2 foo .
see foo

foo の定義中に、 テキスト・インタプリタは MY-+ のコンパイル機能(compilation semantics)を実行し、 そのコンパイル機能が + のコンパイル機能を実行します。 つまり、 +foo 内にコンパイルします。

この例では、 コンパイル機能(compilation semantics)とコンパイルされたコードのスタック効果について個別のスタック・コメントも表示します。 デフォルトのコンパイル機能を持つワードの場合、 通常、 これらのスタック効果は表示されません。 これらのワードのコンパイル機能のスタック効果は常に ( -- ) であり、 コンパイルされたコードのスタック効果はインタプリタ機能(interpretation semantics)のスタック効果です。

注意: この方法でコンパイル機能(compilation semantics)を実行する場合、 インタプリタの状態には影響を受けないことに注意してください。 あなたはそれを対話的(interpretively)に実行することもできます。 例:

: foo2 ( n1 n2 -- n )
 [ MY-+ ] ;
1 2 foo2 .
see foo2

ただし、 これが常に機能するとは限らない、良くない Forth システムがいくつかあるため、 この方法は 1999 年に非標準となりました。

POSTPONE を使用する別の例を以下に示します:

: MY-- ( Compilation: -- ; Run-time of compiled code: n1 n2 -- n )
 POSTPONE negate POSTPONE + ; immediate compile-only
: bar ( n1 n2 -- n )
  MY-- ;
2 1 bar .
see bar

ENDIF は以下の方法で定義できます:

: ENDIF ( Compilation: orig -- )
  POSTPONE then ; immediate

研究課題(assignment): 2dup と同等のコンパイル機能(compilation semantics)を持つ MY-2DUP を作成しますが、 コンパイルされるのは over over になるようにしてみましょう。