Встановіть машину WABAC , Шерман. Це питання стосується BASIC взагалі та зокрема BASIC-80 Microsoft . Стара школа основна. З номерами рядків.
Як (або, скоріше, зробили) старі школи інтерпретатори BASIC поводяться ДЛЯ ... СЛУХАЛЬНИХ циклів, коли тіло циклу не виконується, а оператор NEXT з'явився з ладу?
NEXT-повідомлення, що не вийшло з попереднього часу:
Ось підпрограма з гри " Авари з Девіда Х. Аха" "101 Основні комп'ютерні ігри" :
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
Це повертає не дуже прихильні спогади? Ви чуєте, як Дайкстра перекочується в його могилі?
Ось цікава частина того, що відбувається в цьому фрагменті:
- Другий цикл FOR, оскільки він використовує ту саму змінну циклу, замінює перший цикл FOR
- Дві петлі FOR мають один і той же NEXT оператор
- Наступний оператор циклу FOR NEXT надходить до нього, у вихідному порядку, але після нього, у порядку виконання
Ви можете припустити, що інтерпретатор, запустивши цикл FOR, просто запускає оператори, поки це не відбудеться через цикл NEXT. Порядок висловлювання у джерелі в цьому випадку не має значення. Але давайте подивимось, що посібник basic80 повинен сказати про петлі FOR:
У посібнику з базових 80 написано "му ..."
Тіло циклу пропускається, якщо початкове значення циклу, кратне знаку кроку, перевищує кінцеве значення, кратне знаку кроку.
Отже, тіло петлі можна пропустити цілком.
Ми маємо докази у формі опублікованих програм про те, що принаймні деякі версії BASIC динамічно розміщували свої наступні заяви. Це досить легко зробити, коли виконується тіло циклу. Однак у випадку, коли тіло оператора FOR слід пропустити, як це дозволяє BASIC-80, як BASIC знайшов операцію NEXT, враховуючи, що це може бути перед оператором FOR у порядку джерела?
- Чи завжди версія BASIC, що використовується в "101 Основних комп'ютерних іграх", виконувала тіло циклу хоча б один раз?
- Чи вимагав BASIC-80, щоб після оператора FOR виникло наступне твердження циклу FOR, у порядку джерела?
PS: Так, я пишу перекладача BASIC для старої школи BASIC. Це хвороба.
NEXT
оператор, починається з $ DCF9.