Forth系言語には、STATES(状態)という観念があります。これは、モードということもできます。特に重要なのは、実行状態(execution state)とコンパイル状態(compilation state)の区別です。具体的には、コンパイル状態であるのは、ワード定義の中とメソッド定義の中であり、それ以外は実行状態です。例えば、ワード定義でいえば、コロン「:」は実行状態をコンパイル状態に切り替え、セミコロン「;」はコンパイル状態を実行状態に切り替えます。
このような区別が重要になるのは、Mops/Forthでは、実行もコンパイルも、すべてがワードの実行として行われると考えるからです。コンパイルもまたそこまでに定義されたワードの実行でしかなく、そして、定義がコンパイルされた後は、そのワードもまた実行可能になるのです。
すべてがワードの実行であり、ワードを名前で呼び出すことによって実行されるとすると、通常のワードは、実行状態で呼び出された場合と、コンパイル状態で呼び出された場合とで動作が異なるということになります。というのは、実行状態で呼びだされれば、当然、そのワードの定義内容となっているコードが実行されますが、コンパイル状態では、そのワードの呼び出しがコンパイルされるに止まるからです。つまり、現在定義されているワードが実行されたとき、初めて実行されるのです。
現実に実行されたとき同等の働きをするとしても、実行時とコンパイル時には、一般に異なる動作が必要であり、特に、ワードによってはコンパイル時には非常に複雑な動作をする必要がある場合もあります。このようなワードは、状態によって条件づけて、異質なコードを貼り合わせる必要がでてきます。このような場合利用されるのは、STATEというシステム変数です。この変数は、MopsではVALUE変数であり、コンパイル状態ではTRUE、それ以外ではFALSEを返します。
したがって、MopsではSTATEと書くだけで、trueないしfalseが得られますが、Forth規格ではSTATEはこの変数のアドレスを返すことになっています。ですから標準のForthでは、STATE @と書くべきことになります。
状態によってなすべきことが大きく異なり、複雑な手続きを踏まなければならないような場合には、コンパイル状態用のワードと、実行状態用のワードを別々に定義する方がよいともいわれます。その方が、各ワードの動作が明確だからです。
機能的には等価でありながら、状態に応じて異なるワードが準備されている例として、「'」(tick)と「[']」(bracket-tick)、「CHAR」と「[CHAR]」などがあります。
関連項目:
最終更新:2019年06月18日 17:19