Stellen Sie die WABAC-Maschine ein , Sherman. Diese Frage bezieht sich auf BASIC im Allgemeinen und auf Microsoft BASIC-80 im Besonderen. Old School Basic. Mit Zeilennummern.
Wie behandeln (oder besser gesagt) BASIC-Interpreter der alten Schule FOR ... NEXT-Schleifen, wenn der Schleifenkörper nicht ausgeführt wurde und die NEXT-Anweisung nicht in der richtigen Reihenfolge angezeigt wurde?
Eine nicht ordnungsgemäße NEXT-Anweisung aus der vorherigen Zeit:
Hier ist eine Unterroutine aus dem Spiel Awari aus David H. Ahls "101 Basic Computer Games" :
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
und hier ist es mit allem außer der Flusskontrolle redigiert:
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
Bringt das nicht so schöne Erinnerungen zurück? Kannst du Dijkstra in seinem Grab herumrollen hören ?
Hier ist der interessante Teil dessen, was in diesem Fragment passiert:
- Die zweite FOR-Schleife ersetzt die erste FOR-Schleife, da sie dieselbe Schleifenvariable verwendet
- Die beiden FOR-Schleifen haben dieselbe NEXT-Anweisung
- Die NEXT-Anweisung der zweiten FOR-Schleife steht davor in der Quellreihenfolge, danach jedoch in der Ausführungsreihenfolge
Sie könnten also annehmen, dass der Interpreter, nachdem er eine FOR-Schleife gestartet hat, einfach Anweisungen ausführt, bis sie in der NEXT-Schleife auftreten. Die Reihenfolge der Aussage in der Quelle spielt in diesem Fall keine Rolle. Aber mal sehen, was das basic80-Handbuch über FOR-Schleifen zu sagen hat:
Das Basic-80-Handbuch sagt "moo ..."
Der Hauptteil der Schleife wird übersprungen, wenn der Anfangswert der Schleife mal das Vorzeichen des Schritts den Endwert mal das Vorzeichen des Schritts überschreitet.
Der Schleifenkörper kann also vollständig übersprungen werden.
Wir haben Beweise in Form von veröffentlichten Programmen, dass zumindest einige Versionen von BASIC ihre NEXT-Anweisungen dynamisch lokalisierten. Dies ist einfach genug, wenn der Schleifenkörper ausgeführt wird. In dem Fall, in dem der Hauptteil der FOR-Anweisung übersprungen werden sollte, wie es BASIC-80 zulässt, wie hat BASIC die NEXT-Anweisung gefunden, da sie möglicherweise vor der FOR-Anweisung in der Quellreihenfolge liegt?
- Hat die in "101 Basic Computer Games" verwendete Version von BASIC den Loop-Body immer mindestens einmal ausgeführt?
- Hat BASIC-80 verlangt, dass die NEXT-Anweisung einer FOR-Schleife nach der FOR-Anweisung in der Quellreihenfolge erfolgt?
PS: Ja, ich schreibe einen BASIC-Dolmetscher für Old School BASIC. Es ist eine Krankheit.
NEXT
Anweisung implementiert , beginnt bei $ DCF9.