VARIABLE宣言によって生成される変数はForth規格に沿った大域変数です。便宜上、Variable変数と呼びます。
もちろん、Variable変数というのは言語的には奇怪です。変数はVariableの訳語ですから。英語では単純に、Variableと呼ばれているようです。
Mopsの変数には、おしなべて、型による縛りはありません。バイト幅さえ適合すれば、何の値でも格納することができます。何でも入る箱と考えることもできます。もちろん、値には意味があります。その混乱を回避する責任の一端をコンパイラに負わせるのではなくて、全面的にプログラマに負わせるということにすぎません。反面、一本気なコンパイラを欺く(説得する)ための技巧を弄する必要もありません。
Variable変数は4バイト幅までの数値を格納できます。特にVariable変数はメモリーの断片と同一視することができます。そこから値を取るワード"@"と、そこに値を格納するワード"!"を用いて値を出し入れします。:
VARIABLE MyVariable \ 宣言による生成
39702 MyVariable ! \ トップスタックにある値を格納
MyVariable @ \ 格納されている値をトップスタックに返す
@および!はメモリーアドレスを用いて4バイト幅の値を出し入れするワードで、
! |
( x addr -- ) |
@ |
( addr -- x ) |
のように動作します。Variable変数を呼び出す(名前を書く)と、それに割り当てられた格納領域のメモリーアドレス値がスタックにおかれるということです。
Variable変数は1バイトまたは2バイトの変数として利用することができます。全4バイトのうち、はじめの1バイトないし2バイトを使うのです。そのためには、値の出し入れに、特別なワードを使う必要があります。:
c! |
( c addr -- ) |
アドレスから1バイトにトップスタックの値を格納 |
c@ |
( addr -- c ) |
アドレスから1バイト分に格納された値をトップスタックに返す |
w! |
( x addr -- ) |
アドレスから2バイトにトップスタックの値を格納 |
w@ |
( addr -- x ) |
アドレスから2バイト分に格納された値をトップスタックに返す |
データスタックは4バイトセルで区分けされているので、バイト幅の違う数値は、そのつど適当な変換を伴っていることに注意しましょう。例えば、負の数値も適切に拡張されます。
関連項目
最終更新:2018年12月13日 00:46