Next: , Previous: , Up: Defining Words   [Contents][Index]


6.10.1 CREATE

定義ワードは、 ディクショナリに新しいエントリを作成するために使用されます。 最も単純な定義ワードは CREATE です。 CREATE は以下のように使用します:

CREATE new-word1

CREATE はパース・ワード(parsing word)です。 つまり、入力ストリームから引数(argument)を受け取ります(この例では new-word1 です)。 CREATEnew-word1 のディクショナリ・エントリを作成します。 new-word1 が実行される時は、 アドレスがスタックに残されるだけです。 そのアドレスは、 new-word1 が定義された時点のデータ空間ポインタ(HERE)の値を表します。したがって、 CREATE は名前をメモリ領域のアドレスに関連付ける方法です。

Create ( "name" –  ) core “Create”

注意: 標準 Forth は、 create に対してのみ、 そのボディ部分がディクショナリのデータ空間(つまり、 hereallot などが機能する空間。 see Dictionary allocation)にあることを保証することに注意してください。 また、 標準 Forth では、 does> で変更できるのは create で作成されたワードのみで(see User-defined Defining Words)、 標準 Forth の >bodycreate されたワードにのみ適用できます。

この new-word1 の例を拡張して、 データ空間にメモリを少々確保すると、 最終的には variable のような代物になります。 これを行う 2 つの異なる方法を以下に示します:

CREATE new-word2 1 cells allot  \ 1 セル予約 - 初期値未定義
CREATE new-word3 4 ,            \ 1 セル予約 かつ (4で)初期化

これらの変数は、 以下のように @ (「フェッチ」(fetch;取り出す)) と ! (「ストア」(store;格納する)) を使用して検査(examine)および変更(modify)できます:

new-word2 @ .      \ get address, fetch from it and display
1234 new-word2 !   \ new value, get address, store to it

同様のメカニズムを使用して配列を作成できます。 たとえば、 80 文字のテキスト入力バッファーです:

CREATE text-buf 80 chars allot

text-buf 0 chars + c@ \ the 1st character (offset 0)
text-buf 3 chars + c@ \ the 4th character (offset 3)

メモリに適切な領域を割り当てることで、 思いつく限りの複雑なデータ構造を構築できます。 これについてさらに詳しく説明し、 それを容易にする Gforth ツールについて知りたい場合は、 See Structures を参照ください。