一般のForthでは、構造化されたデータにはアレイ(Array)を使うようです。アレイとはいっても、実際は単なる長い(バイト幅が大きい)Variable変数でしかありません。必要に応じて分節すればよいわけです。1バイトアレイと考えれば、文字列を格納することもできます(1文字1バイトのコーディングの場合)。実際、Forthの文字列変数には、アレイが用いられています。
アレイをつくるには、CREATEとALLOTを用います。
CREATE myArray 4 CELLS ALLOT
とすれば、4セル(PowerMopsでは16バイト(128ビット))の長さのアレイmyArrayが生成されます。ちなみに、セルはその機械が処理する記憶の単位で、8ビットコンピュータなら1バイト、16ビットコンピュータなら2バイト、32ビットコンピュータなら4バイト、64ビットコンピュータなら8バイト、ということになります。もっとも、PowerMopsではこれは4で固定されています。
4 CELLSの部分は数値で指定もできます。その場合は、バイトが単位になります。
アレイは一続きのメモリー領域と考えることができます。名前myArrayを呼び出せば、トップスタックに、この領域の先頭のアドレス(ポインタ値)が積まれます。
上でつくったアレイを、例えば4バイトずつ区切って、四つの4バイト要素(例えばポインタ)を持つアレイとしましょう。ベタで操作してもいいですが、例えば、次のようなワードをつくってみましょう。
: ^ELM ( addr n -- add+4n ) 4* + ;
これで、myArrayが第0要素から第3要素の四つの要素を持つかのように操作できます。
myArray 2 ^ELM @ \ 第2要素(前から三つ目)として格納されたを取り出す。
addr myArray 0 ^ELM ! \ addrを第0要素として格納
なお、Mopsでは、既定クラスのおかげで、このようなアレイが必要になる機会は滅多にありません。
なお、Mopsのアレイクラスのために^ELEMというワードがすでに使われているので、上では少し変えておきました。また、上の例にはアレイの境界をはみ出した場合のチェックとかもありません。あくまでも簡易版とお考えください。
関連項目:
最終更新:2018年12月22日 19:06