设置WABAC机器 Sherman。这个问题通常与BASIC有关,尤其与Microsoft的BASIC-80有关。老派基本。带行号。
当循环主体未执行且NEXT语句出现故障时,老式的BASIC解释器如何(或更确切地说,是)如何处理FOR ... NEXT循环?
与之前时间无序的NEXT语句:
这是David H. Ahl的“ 101基本计算机游戏”中Awari游戏的子例程:
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
这就是除流量控制之外的所有内容:
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
那会带回不太喜欢的回忆吗?你能听到迪克斯特拉 在坟墓里翻滚吗?
以下是此片段中发生的有趣的部分:
- 由于第二个FOR循环使用相同的循环变量,因此它将替换第一个FOR循环
- 两个FOR循环共享相同的NEXT语句
- 第二个FOR循环的NEXT语句按源顺序在它之前,但按执行顺序在它之后
然后,您可能会认为,解释器已经开始执行FOR循环,只运行语句,直到它在NEXT循环中发生为止。在这种情况下,源中语句的顺序无关紧要。但是,让我们看看basic80手册对FOR循环必须说些什么:
基本80手册上写着“ moo ...”
如果循环的初始值乘以步长的符号超过最终值乘以步长的符号,则跳过循环的主体。
因此,循环体可以完全跳过。
我们以公开程序的形式证明,至少某些BASIC版本正在动态查找其NEXT语句。这在执行循环主体时很容易做到。但是,在应跳过FOR语句的主体的情况下(如BASIC-80所允许的那样),考虑到源代码可能位于FOR语句之前,BASIC如何定位NEXT语句?
- “ 101基本计算机游戏”中使用的BASIC版本是否总是至少执行一次循环主体?
- BASIC-80是否要求FOR循环的NEXT语句按源顺序出现在FOR语句之后?
PS:是的,我正在为老式BASIC编写BASIC解释器。这是一种疾病。
NEXT
语句的代码从$ DCF9开始。