Установите машину WABAC , Шерман. Этот вопрос касается BASIC в целом и Microsoft BASIC-80 в частности. Старая школа базовая. С номерами строк.
Как (или, вернее, сделали) интерпретаторы старой школы BASIC обрабатывают циклы FOR ... NEXT, когда тело цикла не было выполнено, а оператор NEXT появился не в порядке?
СЛЕДУЮЩИЙ оператор СЛЕДУЮЩЕГО от предшествующего времени:
Вот подпрограмма из игры Awari из «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
- Оператор NEXT второго цикла FOR идет перед ним, в порядке исходного кода, но после него, в порядке выполнения.
Тогда вы можете предположить, что интерпретатор, запустив цикл FOR, просто запускает операторы, пока это не произойдет через цикл NEXT. Порядок утверждения в источнике в этом случае не имеет значения. Но давайте посмотрим, что говорит руководство basic80 о циклах FOR:
В руководстве basic-80 написано "му ..."
Тело цикла пропускается, если начальное значение цикла, умноженное на знак шага, превышает окончательное значение, умноженное на знак шага.
Таким образом, тело цикла может быть полностью пропущено.
У нас есть доказательства в виде опубликованных программ, что, по крайней мере, некоторые версии BASIC динамически находили свои СЛЕДУЮЩИЕ операторы. Это достаточно легко сделать, когда выполняется тело цикла. Однако в случае, когда тело оператора FOR должно быть пропущено, как позволяет BASIC-80, как BASIC обнаружил оператор NEXT, учитывая, что он может быть перед оператором FOR в исходном порядке?
- Версия BASIC, используемая в «101 Basic Computer Games», всегда выполняла тело цикла хотя бы один раз?
- Требуется ли для BASIC-80 оператор NEXT цикла FOR после оператора FOR в исходном порядке?
PS: Да, я пишу переводчик BASIC для старой школы BASIC. Это болезнь.
NEXT
оператор, начинается с $ DCF9.