[新連載]復活!TINY BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
すべてはここからはじまりました。
中日電工も。
40年前を振り返りつつ新連載です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第53回]
●FOR,NEXT(2)
前回はFORについて説明しただけで終ってしまいました。
今回はNEXTについて説明します。
NEXT文はFORループの終わりに置きます。
AS THE LOGICAL (NOT NECESSARILLY PHYSICAL) END
と書いてあります。
なかなかに親切です。
ここでいう「終わり」とは「論理的な」終わりであって、「物理的な」終わりである必要はない、ということです。
GOTO文はプログラムの前方でも後方でも自由に飛ぶことができます。
たまたまプログラムの組み方によって(GOTO文を使うことで)、FOR文よりもNEXT文のほうが若い行番号になってしまうことがあるかもしれません。
それでも「論理的に」間違ってなければ構いません。
必ずしもFOR文よりもNEXT文のほうが「物理的に」後ろにある必要はありません。
もっともそういうことが許されることが後年BASICの欠点として指摘を受けることになります。
GOTO文を多用することでそれこそ自由気ままなプログラムを書くことができるため、あとでそのプログラムを読もうとすると前に行ったり後ろに飛んだりとまるで絡み合ったスパゲッティ状態で、これではどこが頭でどこが尻尾かわからんではないか、という批判です。
確かにもっともな指摘です。
そういうプログラムはつとめて書かないようにしたいものです。
しかしGOTO文の便利さに慣れてしまうと、GOTOが使えないC言語はどうしても欲求不満でいらいらしてしまいます。
念のため確認してみたところC++でもGOTOは使えるらしいことがわかりました。
しかし制約はあるようです。
余談になってしまいました。
NEXTの説明に戻ります。
TINY BASICのNEXTは後ろに変数名を記述します。
NEXT 変数名
の形になります。
変数名を省略することはできません。
その変数名と ’LOPVAR’ の値とが照合されます。
正しいプログラムを書いていれば両者は一致するはずです。
もし一致しなければ、一致するまでスタックを「掘り下げて(DIG)」探します。
一致するFOR変数グループがみつかったら、そこまでのスタックは全部削除してしまいます(!)。
いずれにせよ、NEXT文で変数の確認が出来た後、その変数に ’STEP’ の値が加算されます。
そしてその値がFOR文の ’TO’ で設定した上限値以内であることを確認します。
もし上限値以内ならば制御はFOR文の次の命令に戻って、FORループの実行が続けられます。
もしも上限値を越えたならば、現在のFOR変数領域の値はクリアされ、そしてNEXT文の次の文が実行されます。
NEXTについての説明は以上なのですが。
TINY BASICでFOR文とNEXT文の不一致が発見された場合の対応(!をつけた文)については、私としてはちょっと疑問を感じます。
私見なのですが。
確かにFOR文については前回書きましたように、FORのネスティングの中で同じ変数が使われていないかどうかをチェックすることには意味があると思います。
しかしNEXT文でもそれをやる必要があるかというと、それはちょっと疑問です。
NEXT文が実行される時点で、アクティブなFOR変数と一致しなかったならば、そこでWHAT?もしくはHOW?を表示してエラー終了してしまったほうが簡単なのでは、と思います。
TINY BASICでエラーが発生するサンプルプログラムです。
どこが間違っているかわかりますよね。
このプログラムを実行すると、当然エラーが発生します。
実行してみました。
私の考えでは40 NEXT Aでエラーになるべきと思いますが、そうではなくて50 NEXT Bでエラーになります。
40 NEXT Aが実行される時点でアクティブなFORループは変数BのFORループです。
NEXT文の説明にあるように変数名が一致しませんから、その場合には変数Aがみつかるところまでスタックを掘り下げて変数AのFORループをアクティブにします。
同時に変数BのFORループは削除してしまいます(強制終了です)。
そのあとで50 NEXT Bが実行されるため、そこでWHAT?が出されることになります。
説明の通りなのですが、この動作はやっぱり気持ちが悪いですし、手間暇かけてわざわざスタックを掘り下げなくても40 NEXT Aを実行する時点で「変数不一致」のエラーにしてしまうほうが、それだけNEXTのプログラムが簡単になってよいように思われます。
TINY BASICの作者がわざわざそのような面倒なプログラムを書いたのには何か理由があるのかもしれませんが、やっぱり私にはちょっと納得ができません。
こちらは中日電工のZB3BASICでの実行例です。
ERR:20は「FOR文とNEXT文で変数名が一致しない」というエラーです。
復活!TINY BASIC[第53回]
2020.8.1upload
前へ
次へ
ホームページトップへ戻る