以下使用してグローバル変数 v
を作成できます:
variable v ( -- addr )
v
は、スタックにメモリー内の、とあるセルのアドレスをプッシュします。 このセルは variable
によって予約されています。 !
(ストア)を使用してスタックからこのセルに値を保存し、
@
(フェッチ)を使用して値をメモリーからスタックにロードできます:
v . 5 v ! .s v @ .
dump
を使用すると、 メモリーの生のダンプ(メモリー・ダンプ)を確認できます:
v 1 cells .s dump
Cells ( n1 -- n2 )
は、 n1 個のセル が占めるバイト数(より一般的にはアドレス単位(address
units)(aus))を与えます。 そして、 あなたは、 さらに多くのメモリーを予約することもできます:
create v2 20 cells allot v2 20 cells dump
変数のようなワード v2
を作成し、 20 個の初期化されていないセルを予約します。 v2
によってプッシュされたアドレスは、 これら 20 個のセルの先頭を指します(see CREATE
)。 あなたは、 アドレス演算を使用して、
これらのセルにアクセスできます:
3 v2 5 cells + ! v2 20 cells dump
,
を使用してメモリーを予約 かつ 初期化できます:
create v3 5 , 4 , 3 , 2 , 1 , v3 @ . v3 cell+ @ . v3 2 cells + @ . v3 5 cells dump
研究課題(assignment): 最初のセルは
addr
、 次のセルはaddr cell+
などとして、u
個のセルの値の合計を計算する定義vsum ( addr u -- n )
を記述してみましょう。
variable
と create
の違いは、variable
がセルを割り当てる(allots)ことと、
標準 Forth では変数(variable)に追加のメモリーを割り当てることができないことです。
新しいワードを作成せずにメモリーを予約することもできます:
here 10 cells allot . here .
最初の here
は(最初の here
時点の)ディクショナリー領域の後のアドレスをプッシュし、
メモリー領域の開始アドレスとして使い、 2 番目の here
は(2 番目の here
時点の)ディクショナリー領域の後のアドレスをプッシュします。 この開始アドレスはどこかに保存する必要があります。 そうしないと、
あなたはこのメモリー領域を再度見つけるのが困難になります。
Allot
はディクショナリー・メモリーを管理します。 ディクショナリー・メモリーには、 Gforth や他のほとんどの Forth
システムの、 ワードなどのシステムのデータ構造が含まれています。 これはスタックのように管理されます。
あなたは以下のようにして割り当て(allot
)したメモリーを解放できます:
-10 cells allot here .
注意: その合間に新しいワードを作成した場合、 それを実行できないことに注意してください(allot
で作成されたメモリーが、
もはやディクショナリー「スタック」の頂上ではなくなるため)。
その代わりに、 allocate
や free
を使用すると、 任意の順序でメモリを解放できます:
10 cells allocate throw .s 20 cells allocate throw .s swap free throw free throw
throw
はエラー(メモリー不足など)を処理します。
また、 ガベージ・コレクター なら、 メモリーを明示的に解放(free
)する必要がなくなります。
こちらも参照ください: Memory