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
になるようにしてみましょう。