FOR~NEXTが完成

FOR~NEXTは断片的な処理のしかたを思いつくけれどそれが全体の流れにまとまらない、という状態で止まっていた。考えあぐねていつまでも前進しないので、とりあえずスタックをGOSUB~RETURNと区別する方法で、書けるところから書くことにした。FORはすでに完成している関数の組み合わせでプログラムの意図を読み取ることができる。FORがやるべきことは変数に初期値を代入し、変数名(実際は変数番号)とTOのあとの終了値とSTEPのあとの増分、そしてGOSUBと同様に行ポインタと中間コードポインタをスタックに押し込む。ここまではもう思いついている。

FORがこのあと何をしたらいいか、いくら考えてもわからない。もしかしたらもう何もしなくていいんじゃないか。ということで、次にNEXTの処理を書いてみる。

NEXTはスタックから変数名を取り出してFORと対応するかどうかを調べ、対応したら次の処理を行う。スタックから取り出した増分を変数に加え、スタックから取り出した終了値と比較。繰り返し終了の場合(変数値>終了値、増分が負なら変数値<終了値)、スタックに押し込んだ全部の値を復帰してもう何もしない。繰り返し継続の場合、RETURNと同様に行ポインタと中間コードポインタを復帰し、再度、全部の値をスタックに押し込んで、あれ、それだけか。

どうせ暴走するに違いないと思い、指を[Ctrl]と[C]にかけながら動かしてみたら、何と、正しく動いてしまった。動作確認を繰り返すと、終了値に0を指定したとき(たとえばFOR I=9 to 0 STEP -1)エラーで停止する。原因はスタックのエラーをNULLで判定していたことにある。この問題はエラーフラグで判定する方法に変更して解決。また、RETURNが繰り返しのたびに5個の値をスタックへ退避、復帰する処理があまりに冗長なので、スタックポインタ相対参照に変更。

TinyBASICの機能はこれで完成。あとは処理の最適化と名前の整理をすればいい。きれいに完成したところで公開しようと思う。

結局、FOR~NEXTも「案ずるより生むが易し」ということか。ぼくは思い悩む時間が無駄だとは考えていない。当面の無駄ではあってもいつか役に立つときがある。しかし、現実の課題と真摯に向き合うためにいちばんいい方法はとにかくやってみることだ。これまでたくさんの難しそうな課題が、やってみてうまく解決できた。これからは、やってみるかどうかはともかく、現実の課題とより真摯に向き合う必要がある。

広告
カテゴリー: TinyBASIC パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中