目次

反復処理

 構造化プログラムを実現するには、次の3構造が備わってなければなりません。

 順次処理は、実行すべき内容を並べていけばよいので
 ワードを上から下に並べるだけ。

 反復は、条件判定と順次処理の組合せで実現できます。

 FORTHインタプリタの場合、反復で使うワードは無限回の
 場合と条件指定の区別をして使います。

 無限回の反復は、以下。

 完全な無限ループは、最初のbegin ... againですが
 フラグを利用する場合、そのフラグを反復開始の前に
 チェックするか、ワードを実行してからのチェックか
 になります。

 untilを含んだワードでは、フラグを判定するタイミングが
 全ワードを実行してからで、後判定反復と呼びます。

 while ... repeatの場合は、前判定反復と呼ばれます。

 前判定反復

  1から10までの整数値を加算した結果を求める
  ワードを定義し、前判定反復で使う構文をテスト
  します。



  変数VAをカウンタに利用し、反復回数を制御。

  加算結果をスタックに入れると、制御変数は
  ひとつあれば充分。

 後判定反復

  条件が成立するまで、ワードを実行するのかを実験。



  無限回の反復ですが、条件をつけて反復を終了する中で
  範囲外になったかどうかをフラグに入れて判定。

  untilを利用するときは、条件が成立したなら終了。
  whileでは、条件が成立している間は反復。

  whileの方だけを正確に使えれば、untilを使う場面
  での間違いは、少ないでしょう。

 有限回の繰返しでは、制御変数を利用します。

  limit index   do ... [one or more leave(s)] ... loop
	       ?do ... [one or more leave(s)] ... loop
	        do ... [one or more leave(s)] ... n +loop
	       ?do ... [one or more leave(s)] ... n +loop

        k               ( -- u|n ) Gives third  loop index
        j               ( -- u|n ) Gives second loop index
        i               ( -- u|n ) Gives innermost loop index


        unloop          (R: old-limit old-index -- )
                        Drops innermost loop structure,
                        pops back old loop structures to loop registers

        exit            ( -- ) Returns from current definition.
                               Compiles a ret opcode.

        leave           ( -- ) (R: old-limit old-index -- )
                        Leaves current innermost loop promptly

        +loop           ( u|n -- )
                        (R: unchanged | old-limit old-index -- )
                        Adds number to current loop index register
                        and checks whether to continue or not

        loop            ( -- )
                        (R: unchanged | old-limit old-index -- )
                        Increments current loop index register by one
                        and checks whether to continue or not.

        ?do             ( Limit Index -- )
                        (R: unchanged | -- old-limit old-index )
                        Begins a loop if limit and index are not equal

        do              ( Limit Index -- )
                        (R: -- old-limit old-index )
                        Begins a loop

 このワードの説明でも、わかりにくかったので、1から10の整数の
 合計値を求める処理で、動作を確認してみます。



 最終値を10とすると、ワード「xsum」に値がわたってから
 ワード「1+」を実行した時点で、スタックの内容は(0 11)
 になっています。

 do ... loop内部では、変数iに初期値0から10までを
 設定し、スタックには、ワード「+」を実行する前には
 (0 1) (1 2) (3 3) (6 4) (10 5) ... と値が積まれ
 ます。

 do ... loop内部では、制御変数はi、j、kを利用できます。
 ネストしていくときに、変数iが最も外、変数kが最も内に
 自動で選択されるので、注意しないといけません。

 2変数が必要なときに、ワード「tuck」を利用すると、スタックに
 変数を入れて反復させることもできます。

 後判定反復で、1から10の整数値の和を求めると以下。



 スタックに総和値、カウンタ値の各々を0にして格納しています。

 ワード「tuck」を使い、スタックには、総和値、カウンタ値、総和値
 と並ぶように工夫を入れてます。

 前判定反復で、同じことをやってみます。



 スタックに変数を入れると、一読しただけでは、理解できない
 コードになることが多いので、ほどほどにしておきます。

 頭の体操やその場限りのワードを定義して使うには、スタックの
 中に変数を用意しても大丈夫ですが、時が経つと、判読不可能に
 なることが多いので、わかりやすくしたければ、変数を使います。

 FORTHインタプリタは、コンピュータシステムをメモリ容量が
 少ないときも、使いやすくすることが設計思想にあります。

 スタック利用で、使いにくくなっては、本末転倒です。


目次

inserted by FC2 system