この局所変数は、スタック経由でワードに渡されたパラメターを自動的に格納します。名前付き引数(named parameter)を利用すれば、スタック上におかれたパラメターをいったん取り上げて格納し、必要に応じて取り出すことができます。初期値としてパラメター値が格納されますが、不要になったら通常の局所変数として、値を付け替えることができます。利用構文は、LOCALSに共通、つまり、Value変数と同じです。
宣言の形式は、
: myWord { param1 param2 -- } ...... ;
つまり、LOCALSとの相違点はバックスラッシュがないことだけです。このワードは、スタック上に少なくとも二つのアイテム(数値)をパラメターとして要求することになります。スタック上のアイテムは、トップスタック値がparam2に、一つ下がparam1に格納され、二つのスタックアイテムは費消されます。
使い方は、
param1 \ param1に格納された値をトップスタックに返す
... -> param1 \ その時点でのトップスタック値を格納する
2 ++> param2 \ param2の値を2(=その時点でのトップスタック値)だけ増やす
3 --> param2 \ param2の値を3(=その時点でのトップスタック値)だけ減らす
効率性への配慮:
局所変数は、localsでもnamed parameterでも、原則としてレジスタ変数として実装されているので、1ワード内での値の操作は非常に高速化されることになります。ただし、
はじめにレジスタにあった値をいったんメモリー内にセーブするので、その分のオーバーヘッド(超過負担)はあります。また、レジスタの個数には限りがあります。PowerMopsのTech noteによれば、
ループを含む場合には最高9個、ループがなければ11個までは、局所変数はレジスタのみで、メモリーにアクセスすることなく処理できるとされています。スタックも数個まではレジスタでキャッシュされますから、局所変数の個数もスタックアイテムの個数もあまり多くならないよう、最適な個数配分を心がけることがMopsで「速い」アプリケーションを設計する鍵となるようです。Forth系言語で一般に見られるように局所変数を毛嫌いする動機は、Mopsには全くありません。
なお、名前付き引数は、局所変数(locals)の一種ですが、狭義の局所変数と共に用いることもできます。その場合、Mopsでは一緒に定義することとなっています。例えば、
: word1 { p1 p2 \ loc1 loc2 -- } ...
のように宣言すれば、word1の定義内では、p1, p2は名前付き引数として、\ 以降の loc1とloc2は、狭義の局所変数として利用できます。
浮動小数点数の引数を用いたい場合には、局所変数の場合と同様、名前を%で始めます。
: word2 { p1 p2 %fp1 -- } ...
使い方は整数の場合と同じですが、値のやり取りは小数スタック経由で行われます。
関連項目:
最終更新:2019年07月15日 17:57