Réglez la machine WABAC , Sherman. Cette question concerne BASIC en général, et BASIC-80 de Microsoft en particulier. Old school basique. Avec des numéros de ligne.
Comment (ou, plutôt, les interprètes BASIC old-school ont-ils géré les boucles FOR ... NEXT lorsque le corps de la boucle n'a pas été exécuté et que l'instruction NEXT est apparue dans le désordre?
Une instruction NEXT désordonnée de l'heure précédente:
Voici un sous-programme du jeu 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
et le voici avec tout sauf le contrôle de flux expurgé:
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
Cela ramène-t-il des souvenirs moins sympathiques? Peux-tu entendre Dijkstra se retourner dans sa tombe?
Voici la partie intéressante de ce qui se passe dans ce fragment:
- La deuxième boucle FOR, car elle utilise la même variable de boucle, remplace la première boucle FOR
- Les deux boucles FOR partagent la même instruction NEXT
- La deuxième instruction NEXT de la boucle FOR vient avant elle, dans l'ordre source, mais après elle, dans l'ordre d'exécution
Vous pourriez alors supposer que l'interpréteur, ayant démarré une boucle FOR, exécute simplement des instructions jusqu'à ce qu'il se produise dans la boucle NEXT. L'ordre de la déclaration dans la source n'a pas d'importance dans ce cas. Mais voyons ce que le manuel de base80 a à dire sur les boucles FOR:
Le manuel de base-80 dit "moo ..."
Le corps de la boucle est ignoré si la valeur initiale de la boucle multipliée par le signe de l'étape dépasse la valeur finale multipliée par le signe de l'étape.
Ainsi, le corps de la boucle peut être entièrement ignoré.
Nous avons des preuves, sous forme de programmes publiés, qu'au moins certaines versions de BASIC localisaient dynamiquement leurs instructions NEXT. C'est assez facile à faire lorsque le corps de la boucle est en cours d'exécution. Cependant, dans le cas où le corps de l'instruction FOR devrait être ignoré, comme le permet BASIC-80, comment BASIC a-t-il localisé l'instruction NEXT, étant donné qu'elle pourrait se trouver avant l'instruction FOR dans l'ordre source?
- La version de BASIC utilisée dans "101 Basic Computer Games" a-t-elle toujours exécuté le corps de la boucle au moins une fois?
- BASIC-80 a-t-il exigé que l'instruction NEXT d'une boucle FOR se produise après l'instruction FOR, dans l'ordre source?
PS: Oui, j'écris un interprète BASIC pour la vieille école BASIC. C'est une maladie.
NEXT
instruction commence à $ DCF9.