Configura la máquina WABAC , Sherman. Esta pregunta es sobre BASIC en general, y BASIC-80 de Microsoft en particular. Vieja escuela básica. Con números de línea.
¿Cómo manejan (o mejor dicho) los intérpretes BASIC de la vieja escuela los bucles FOR ... NEXT cuando el cuerpo del bucle no se ejecutó y la instrucción NEXT apareció fuera de orden?
Una declaración NEXT fuera de servicio del tiempo anterior:
Aquí hay una subrutina del juego 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
y aquí está con todo excepto el control de flujo redactado:
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
¿Eso te trae recuerdos no tan cariñosos? ¿Puedes oír a Dijkstra rodando en su tumba?
Aquí está la parte interesante de lo que está sucediendo en este fragmento:
- El segundo bucle FOR, ya que usa la misma variable de bucle, reemplaza el primer bucle FOR
- Los dos bucles FOR comparten la misma instrucción NEXT
- La segunda instrucción NEXT del bucle FOR viene antes, en orden de origen, pero después, en orden de ejecución
Puede suponer, entonces, que el intérprete, después de haber iniciado un ciclo FOR, simplemente ejecuta declaraciones hasta que sucede a través del ciclo NEXT. El orden de la declaración en la fuente no importa en este caso. Pero veamos qué dice el manual basic80 sobre los bucles FOR:
El manual básico-80 dice "mu ..."
El cuerpo del bucle se omite si el valor inicial del bucle multiplicado por el signo del paso excede el valor final multiplicado por el signo del paso.
Por lo tanto, el cuerpo del bucle se puede omitir por completo.
Tenemos evidencia, en forma de programas publicados, de que al menos algunas versiones de BASIC estaban localizando dinámicamente sus declaraciones NEXT. Esto es bastante fácil de hacer cuando se ejecuta el cuerpo del bucle. Sin embargo, en el caso en el que se debe omitir el cuerpo de la instrucción FOR, como lo permite BASIC-80, ¿cómo BASIC ubicó la instrucción NEXT, dado que podría estar antes de la instrucción FOR en orden de origen?
- ¿La versión de BASIC utilizada en "101 Juegos básicos de computadora" siempre ejecutó el cuerpo del bucle al menos una vez?
- ¿BASIC-80 requirió que se produjera una instrucción NEXT del bucle FOR después de la instrucción FOR, en orden de origen?
PD: Sí, estoy escribiendo un intérprete BASIC para BASIC de la vieja escuela. Es una enfermedad.
NEXT
declaración comienza en $ DCF9.