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文で全てクリアした後でプログラムの先頭に戻ることが望ましい。もちろん、その場合はプログラムの状態は保存できない。