目次

電卓としての利用(プログラムモード)

 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」を利用します。


目次

inserted by FC2 system