Defina a máquina WABAC , Sherman. Esta pergunta é sobre o BASIC em geral, e o BASIC-80 da Microsoft em particular. Velha escola básica. Com números de linha.
Como (ou melhor) os intérpretes do BASIC da velha escola lidam com loops FOR ... NEXT quando o corpo do loop não foi executado e a instrução NEXT apareceu fora de ordem?
Uma instrução NEXT fora de ordem do tempo anterior:
Aqui está uma sub-rotina do jogo Awari de "101 Basic Computer Games" de David H. Ahl :
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
e aqui está tudo, exceto o controle de fluxo redigido:
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
Isso traz de volta memórias não tão boas? Você pode ouvir Dijkstra rolando em seu túmulo?
Aqui está a parte interessante do que está acontecendo neste fragmento:
- O segundo loop FOR, uma vez que usa a mesma variável de loop, substitui o primeiro loop FOR
- Os dois loops FOR compartilham a mesma instrução NEXT
- A instrução NEXT do segundo loop FOR vem antes, na ordem de origem, mas depois, na ordem de execução
Você pode supor, então, que o intérprete, após iniciar um loop FOR, simplesmente executa instruções até que ocorra no loop NEXT. A ordem da declaração na fonte não importa neste caso. Mas vamos ver o que o manual basic80 tem a dizer sobre os loops FOR:
O manual do basic-80 diz "moo ..."
O corpo do loop é pulado se o valor inicial do loop multiplicar o sinal da etapa exceder o valor final multiplicar o sinal da etapa.
Portanto, o corpo do loop pode ser ignorado completamente.
Temos evidências, na forma de programas publicados, de que pelo menos algumas versões do BASIC estavam localizando dinamicamente suas declarações NEXT. Isso é fácil o suficiente quando o corpo do loop está sendo executado. No entanto, no caso em que o corpo da instrução FOR deve ser ignorado, como permite o BASIC-80, como o BASIC localizou a instrução NEXT, considerando que ela pode estar antes da instrução FOR na ordem de origem?
- A versão do BASIC usada em "101 Basic Computer Games" sempre executava o corpo do loop pelo menos uma vez?
- O BASIC-80 exigiu que a instrução NEXT de um loop FOR ocorresse após a instrução FOR, na ordem de origem?
PS: Sim, estou escrevendo um intérprete BASIC para o BASIC da velha escola. É uma doença.
NEXT
instrução começa em $ DCF9.