WABACマシン、Shermanを設定します。この質問は、BASIC全般、およびMicrosoftのBASIC-80に関するものです。特にです。オールドスクールベーシック。行番号付き。
ループ本体が実行されておらず、NEXTステートメントが順不同である場合、旧式のBASICインタープリターはFOR ... NEXTループをどのように処理しますか(あるいは、そうしましたか)。
以前からの順不同のNEXTステートメント:
これは、David H. Ahlの「101 Basic Computer Games」からのゲームAwariのサブルーチンです。
200 K=M:GOSUB 600
205 E=0:IF K>6 THEN K=K-7
210 C=C+1:IF C<9 THEN F(N)=F(N)*6+K
215 FOR I=0 TO 5:IF B(I)<>0 THEN 230
220 NEXT I
225 RETURN
230 FOR I=7 TO 12:IF B(I)<>0 THEN E=1:RETURN
235 GOTO 220
そしてここでは、編集されたフロー制御以外のすべてのものです:
200 GOSUB 600
215 FOR I=0 TO 5:IF ... THEN 230
220 NEXT I
225 RETURN
230 FOR I=7 TO 12:IF ... THEN RETURN
235 GOTO 220
それはあまり好きではない思い出を呼び戻しますか?ダイクストラが聞こえますか 墓で転がっているのますか?
このフラグメントで起こっていることの興味深い部分は次のとおりです。
- 2番目のFORループは同じループ変数を使用するため、最初のFORループを置き換えます
- 2つのFORループは同じNEXTステートメントを共有します
- 2番目のFORループのNEXTステートメントは、その前にソース順で続きますが、その後に実行順があります
次に、FORループを開始したインタプリタが、NEXTループ全体で発生するまでステートメントを実行するとします。この場合、ソース内のステートメントの順序は重要ではありません。しかし、basic80マニュアルがFORループについて何を言っているか見てみましょう:
basic-80のマニュアルには "moo ..."と書かれています
ループの初期値にステップの符号を掛けたものが、最終値にステップの符号を掛けたものを超える場合、ループの本体はスキップされます。
したがって、ループ本体は完全にスキップできます。
公開されたプログラムの形で、少なくともいくつかのバージョンのBASICが動的にNEXTステートメントを見つけていたという証拠があります。これはループ本体が実行されているときに簡単に実行できます。ただし、FORステートメントの本文をスキップする必要がある場合、BASIC-80が許可するように、ソース順でFORステートメントの前にある可能性がある場合、BASICはどのようにNEXTステートメントを見つけましたか?
- 「101 Basic Computer Games」で使用されているBASICのバージョンは、ループ本体を少なくとも1回は常に実行しましたか?
- BASIC-80は、FORステートメントの後にソース順でFORループのNEXTステートメントを実行する必要がありましたか?
PS:はい、私はオールドスクールBASICのBASIC通訳を書いています。それは病気です。
NEXT
ステートメントを実装するコードは、$ DCF9から始まります。