Impostare la macchina WABAC , Sherman. Questa domanda riguarda BASIC in generale e Microsoft BASIC-80 in particolare. Vecchia scuola di base. Con i numeri di riga.
In che modo gli interpreti BASIC della vecchia scuola (o, piuttosto,) della vecchia scuola gestiscono i cicli FOR ... NEXT quando il corpo del loop non è stato eseguito e la frase NEXT è sembrata fuori servizio?
Un'istruzione SUCCESSIVA non funzionante rispetto ai tempi precedenti:
Ecco una subroutine del gioco Awari tratto da "101 Basic Computer Games" di 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
ed eccolo con tutto tranne il controllo di flusso redatto:
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
Riporta ricordi non così affezionati? Riesci a sentire Dijkstra rotolare nella sua tomba?
Ecco la parte interessante di ciò che sta accadendo in questo frammento:
- Il secondo ciclo FOR, poiché utilizza la stessa variabile di ciclo, sostituisce il primo ciclo FOR
- I due loop FOR condividono la stessa istruzione NEXT
- La seconda istruzione NEXT del ciclo FOR viene prima di essa, nell'ordine di origine, ma dopo, nell'ordine di esecuzione
Si potrebbe supporre, quindi, che l'interprete, dopo aver avviato un ciclo FOR, esegua semplicemente le istruzioni fino a quando non si verifica nel ciclo SUCCESSIVO. In questo caso, l'ordine dell'istruzione nella fonte non ha importanza. Ma vediamo cosa ha da dire il manuale di base80 sui loop FOR:
Il manuale di base 80 dice "moo ..."
Il corpo del loop viene ignorato se il valore iniziale del loop moltiplica il segno del passaggio supera il valore finale moltiplicato per il segno del passaggio.
Quindi, il corpo del loop può essere saltato del tutto.
Abbiamo prove, sotto forma di programmi pubblicati, che almeno alcune versioni di BASIC stavano individuando dinamicamente le loro dichiarazioni SUCCESSIVE. Questo è abbastanza facile da fare quando viene eseguito il corpo del loop. Tuttavia, nel caso in cui il corpo dell'istruzione FOR debba essere ignorato, come consente BASIC-80, in che modo BASIC ha individuato l'istruzione NEXT, dato che potrebbe trovarsi prima dell'istruzione FOR nell'ordine di origine?
- La versione di BASIC utilizzata in "101 Basic Computer Games" ha sempre eseguito il loop loop almeno una volta?
- BASIC-80 ha richiesto che l'istruzione NEXT di un ciclo FOR si verificasse dopo l'istruzione FOR, nell'ordine di origine?
PS: Sì, sto scrivendo un interprete BASIC per BASIC vecchia scuola. È una malattia.
NEXT
istruzione inizia da $ DCF9.