目次
前
次
電卓としての利用(プログラムモード)
Forthインタプリタは、端末ソフトで接続されているときは
ダイレクト(シェル)モードになっていますが、プログラム
を作成しての利用も可能。
Forthのプログラミングは、ワードを定義しておき、各ワードを
呼び出して使うことになります。
1から10の整数値の総和を求めるには、次のワードを
定義します。
0 variable sum
: tst 11 0 do i sum @ + sum ! loop sum @ . cr ;
動作を確認すると、以下。
このワードにはバグがあり、変数sumをクリアしないと
意図した動作にはなりません。
変数をクリアしないと、次のようになります。
変数sumをゼロクリアしていないので、ワードで計算する都度
値が加算されていき、55の倍数を求めるようになります。
修正するには、次のように変数クリアを入れます。
: test 0 sum ! 11 0 do i sum @ + sum ! loop sum @ . cr ;
ワードを定義して、動作を確認。
ワードの定義は、ワード「:」で始めて、ワード「;」で
終わります。要するに、「:」と「;」の間に、実現する
内容を、はさみこんでいきます。
改行は、ワード「cr」を利用。
プログラムを動かすにはワードを定義し、そのワードを
使ったワードを更に定義してという関数型のプログラム
作成と同じと考えればよいでしょう。
Forthのプログラムは、スタックにデータを出し入れ
することに注目していけば、変数を使わないで処理
することが可能だと理解できます。
スタックにデータを積むためのワードは、「@」であり
スタックからレジスタ、メモリにデータを書込む
ときのワードは、「!」 。
メモリ上にあるスタックとレジスタの間では、ワード
「@」と「!」は、コピーで転送先と転送元の違いだけ
でしかないと理解しておけば充分でしょう。
図を描いてみると、理解が早いと思います。
スタックを利用すると、変数は使わないようにできます。
1からNまでの整数の総和を求めるには、次のワードで
定義できます。
: sumx 1+ 0 swap 0 do i + loop . ;
10までの総和と100までの総和を求めてみると以下。
1からNまでの整数の和は、公式で N(N+1)/2 で求められるので
検算してみると、10x11/2=55、100x101/2=5050で問題ありません。
do ... loopでは、制御変数の初期値と終値が必要なので
終値を+1しておかないと、帳尻が合わないのでワードで
+1しておきます。
初期値と終値は、スタック上から削除されてしまうので
加算結果を入れるため、ワード「1+」の次に、0を入れて
算盤の「ご破算で」と同じことで初期化。
スタックの中に変数を用意して使うのが、Forthで
プログラムすることの肝だと言えるでしょう。
プログラムモードで動かす場合には、SFR(Special Function
Register)やメモリ中のデータを扱いやすくするため、ワード
「constant」を利用します。
目次
前
次