2022年08月20日
川俣晶の縁側ヴィンテージ・パソコン total 1480 count

N-BASICのFOR-NEXTの研究・FORループを終了させずにGOTOで飛びだしても平気なのか?

Written By: 川俣 晶連絡先

 N-BASICのFOR-NEXTの挙動に良く分からない部分があったので、少し調べてみました。

 その結果分かったことは以下の通りです。

  • ループ変数の型はSNGとINTのみ。STRとDBLは使えない
  • ループ変数配列の要素は使えない
  • ループ変数は書き換えられる。同じループ変数のFOR文を別の行(マルチステートメント含む)で複数使っても問題ない(内部のFOR文が書き換えてしまった値が外のFOR文に影響するだけ)
  • 同じ行番号(マルチステートメント含む)のFOR文はメモリを追加消費しない (何回実行してもメモリ消費量は増えない。それまで実行したFOR文はキャンセルされる。なのでNEXTは1つのみで良い)
  • 異なる行番号のFOR文は同じループ変数名でもメモリを追加消費する (NEXTはFORに数だけ必要とされる)
  • 対応するNEXTのないFOR文は外側のNEXTで単純に無かったことにされる (i以下の注釈参照)
  • FORとNEXTの数は合っていなければならない、ということはない (FOR文がキャンセルされしまうケースがいくつかあり、それに対応するNEXTはなくても良い)

 【対応するNEXTのないFOR文は外側のNEXTで単純に無かったことにされる】についての注釈。

 これはFOR A=x to x:FOR B=x to x:NEXT Aとなっているとき、NEXT Aを実行する時にFOR B=x to xの情報はスタックから取り残されることを意味する。

FORループを終了させずにGOTOで飛びだしても平気なのか? §

 結論から言えばほぼ安全。

 FORループが消費するメモリは、特定行番号ごとに決まっているので、同じFORループを再度実行しても消費メモリは増えない。

 ただし、GOSUBとON ERROR GOTOについては、安全ではないことに注意。

 GOSUBは同じ行のGOSUBを何回も実行するとメモリを消費する。(再帰呼び出しができる、ということ)

 ON ERROR GOTOによるエラートラップは、ネストすることができない。エラーが発生した時点で更にエラーを起こすとトラップされないでプログラムは停止する。

望ましい中途脱出 §

 単に、FORループから出るだけなら自由に脱出して良い。

 それで致命的な問題が起きる可能性は低い。

 脱出先で、ダミーのFORループを実行してやると完了せずに残ったループのためのメモリはほぼ回収できる。ただし、FORスタックは回収できるが、ループ変数はクリアできないので、その分のメモリは消費されたまま残る。通常の単純変数をメモリから回収する手段はN-BASICの場合CLEAR文しかないので、CLEAR文が使えない状況では若干のメモリが残ることを諦める。

 しかし、GOSUBなどの他の状況が絡む場合は、CLEAR文で全てクリアした後でプログラムの先頭に戻ることが望ましい。もちろん、その場合はプログラムの状態は保存できない。