Imposta 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, lo facevano) gestiscono i cicli FOR ... NEXT quando il corpo del ciclo non è stato eseguito e l'istruzione NEXT è apparuta fuori servizio?
Una dichiarazione NEXT out-of-order dall'ora precedente:
Ecco una subroutine dal gioco Awari 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
e qui è con tutto tranne il controllo del 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
Questo riporta a ricordi non così carini? 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 di essa, nell'ordine di esecuzione
Si potrebbe supporre, quindi, che l'interprete, dopo aver avviato un ciclo FOR, esegua semplicemente le istruzioni finché non avviene attraverso il ciclo NEXT. In questo caso, l'ordine della dichiarazione nella fonte non è rilevante. Ma vediamo cosa ha da dire il manuale di base80 sui loop di FOR:
Il manuale di base-80 dice "moo ..."
The body of the loop is skipped if the initial value of the loop times the sign of the step exceeds the final value times the sign of the step.
Quindi, il corpo del ciclo può essere saltato interamente.
Abbiamo prove, sotto forma di programmi pubblicati, che almeno alcune versioni di BASIC stavano localizzando dinamicamente le loro dichiarazioni NEXT. Questo è abbastanza facile da fare quando viene eseguito il corpo del loop. Tuttavia, nel caso in cui il corpo dell'istruzione FOR debba essere saltato, come consente BASIC-80, in che modo BASIC ha localizzato l'istruzione NEXT, dato che potrebbe essere prima l'istruzione FOR nell'ordine sorgente?
- La versione di BASIC utilizzata in "101 Basic Computer Games" esegue sempre il corpo del loop almeno una volta?
- BASIC-80 ha richiesto che l'istruzione NEXT del 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.