Ustaw maszynę WABAC , Sherman. To pytanie dotyczy ogólnie BASIC, a szczególnie BASIC-80 Microsoftu . Podstawowa stara szkoła. Z numerami linii.
Jak (a raczej) staroszkolni tłumacze BASIC radzą sobie z pętlami FOR ... NEXT, gdy ciało pętli nie zostało wykonane, a instrukcja NEXT pojawiła się w kolejności?
Komunikat NEXT o braku zamówienia z wcześniejszego okresu:
Oto podprogram z gry Awari z „101 podstawowych gier komputerowych” Davida H. Ahla :
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
i tutaj jest wszystko z wyjątkiem zredagowanej kontroli przepływu:
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
Czy to przywraca niezbyt miłe wspomnienia? Czy słyszysz, jak Dijkstra przewraca się w grobie?
Oto interesująca część tego, co dzieje się w tym fragmencie:
- Druga pętla FOR, ponieważ wykorzystuje tę samą zmienną pętli, zastępuje pierwszą pętlę FOR
- Dwie pętle FOR mają tę samą instrukcję NEXT
- Druga instrukcja NEXT w pętli FOR występuje przed nią w kolejności źródłowej, ale po niej w kolejności wykonania
Można zatem przypuszczać, że interpreter, po uruchomieniu pętli FOR, po prostu uruchamia instrukcje, aż stanie się to w pętli NEXT. W tym przypadku kolejność instrukcji w źródle nie ma znaczenia. Zobaczmy jednak, co ma do powiedzenia instrukcja obsługi basic80 na temat pętli FOR:
Podręcznik Basic-80 mówi „moo ...”
Treść pętli jest pomijana, jeśli początkowa wartość pętli razy znak kroku przekracza końcową wartość razy znak kroku.
Tak więc korpus pętli można całkowicie pominąć.
Mamy dowody w postaci opublikowanych programów, że przynajmniej niektóre wersje BASIC dynamicznie lokalizują swoje NASTĘPNE instrukcje. Jest to dość łatwe do wykonania, gdy wykonywane jest ciało pętli. Jednak w przypadku, gdy treść instrukcji FOR powinna zostać pominięta, jak pozwala BASIC-80, w jaki sposób BASIC zlokalizował instrukcję NEXT, biorąc pod uwagę, że może ona znajdować się przed instrukcją FOR w kolejności źródłowej?
- Czy wersja BASIC zastosowana w „101 podstawowych grach komputerowych” zawsze wykonywała ciało pętli przynajmniej raz?
- Czy BASIC-80 wymagał, aby instrukcja NEXT pętli FOR występowała po instrukcji FOR w kolejności źródłowej?
PS: Tak, piszę tłumacza w języku BASIC dla starej szkoły języka BASIC. To jest choroba
NEXT
instrukcję zaczyna się od $ DCF9.