ワードがコンパイルされる時と、 通訳(interpret)される時では異なる振る舞いをします。 たとえば、 +
について考えてみましょう:
1 2 + . : foo + ;
これらの 2 つの振る舞いは、 コンパイル機能(compilation semantics)とインタプリタ機能(interpretation
semantics)として知られています。 通常のワード(例: +
)の場合、 コンパイル機能は、 現在定義中のワード(上記の例では
foo
)にインタープリター機能を追加します。 つまり、 後で foo
が実行されると、 +
のインタープリター機能(interpretation semantics)(つまり、2 つの数値の加算)が実行されます。
ただし、 if
のような制御フロー・ワードなど、 デフォルト以外のコンパイル機能を持つワードが存在します。
immediate
を使用すると、 最後に定義されたワードのコンパイル機能をインタープリター機能と等しくなるように変更できます:
: [FOO] ( -- ) 5 . ; immediate [FOO] : bar ( -- ) [FOO] ; bar see bar
デフォルト以外のコンパイル機能をもつワードだと知らしめる 2 つの慣習は、 名前を括弧で囲む(より頻繁に使用される)ことと、 名前をすべて大文字で記述する(あまり使用されない)ことです。
if
などの一部のワードについては、 インタープリター機能を使用するのは通常間違いであるため、 それらを
compile-only
としてマークし、 インタープリター機能を使用すると警告が表示されます。
: flip ( -- ) 6 . ; compile-only \ but not immediate flip : flop ( -- ) flip ; flop
この例では、 最初に flip
のインタープリター機能を使用します(警告が表示されます)。 flip
の 2
番目の使用では、 コンパイル機能を使用します(警告は表示されません)。 この例では、 compile-only
が実行時(run-time)ではなくテキスト・インタープリター時に評価される属性であることもわかります。
テキスト・インタープリターには 2 つの状態があります。 インタープリター・モード(interpret)は、 遭遇したワードのインタープリター機能(interpretation semantics)を実行します。 コンパイル・モードでは、 これらのワードのコンパイル機能(compilation semantics)が実行されます。
特に、 :
はコンパイル状態に切り替え、 ;
はインタープリター状態に戻します。 これらには、
状態を切り替えるだけの効果である ]
(コンパイル状態に切り替える) と [
(インタープリター状態に切り替える)
が含まれています。
: xxx ( -- ) [ 5 . ] ; xxx see xxx
これらの角括弧(brackets)は、 上記の命名慣習の源でもあります。
こちらも参照ください: Interpretation and Compilation Semantics