我接触到的第一种编程语言是Sinclair BASIC。像许多BASIC方言一样,它要求对所有源代码行进行编号。
结果,该GO TO命令的使用是惯用的,并且将执行跳转到给定的行号(无标签)。
还有一个相关的GO SUB命令,可以用作基本功能调用。同样,执行跳到给定的行号,但是当RETURN到达命令时,执行跳回到下一个指令GO SUB。
同样,该RUN命令将在给定的行重新开始程序执行。
在行号BASIC解释器中花了任何时间的任何人都将学会使用带空格的编号方案。这样可以更轻松地插入新的代码行。但是即使那样,您仍然可能发现自己需要在连续编号的行之间插入新行。
给定行号为BASIC的列表作为输入,输出相同的程序,但重新编号,以使行号从10开始并以10递增。输入列表可能具有GO TO或GO SUB命令,因此也必须调整与它们相关的数字。
GO TO和GO SUB命令位于单独的行或行的末尾IFTHEN。可以肯定地说^(\d+) .*GO (TO|SUB) (\d+)$,足以匹配这样的界线。这些带引号的命令应被忽略。RUN命令将始终保持独立。在这种情况下,行号是可选的。如果缺少它,那么解释器仅从程序顶部开始。如果一个
GO TO,GO SUB或RUN命令引用不存在的线,那么这反而跳转到下一个定义的线。您的输入需要处理此问题,并确保所有此类行引用均已修复,以便它们指向正确的行。如果在这些命令之一中给出了程序结束后的行号,则行为可能不确定。行号将始终为1到9999之间的正整数(根据手册)。这意味着输入程序永远不会超过999行。
输入行将始终以数字升序编号。
出于此挑战的目的,输入列表将仅包含可打印的ASCII。您无需担心ZX字符集。话虽如此,如果您的条目实际上是写在ZX BASIC或适当的Z80汇编/机器代码(也有模拟器了那里),那么你可以选择你的投入在编码ZX字符集来代替。
您不得使用专门为此目的量身定制的任何重新编号库或实用程序。
输入示例:
1 REM "A rearranged guessing game"
2 INPUT A: CLS
3 INPUT "Guess the number ", B
10 IF A=B THEN PRINT "Correct": STOP
100 IF A<B THEN GO SUB 125
120 IF A>B THEN GO SUB 122
121 GO TO 3
125 PRINT "Try again"
126 RETURN
127 REM "An example of GO TO 7 and GO SUB 13 in quotes"
示例输出:
10 REM "A rearranged guessing game"
20 INPUT A: CLS
30 INPUT "Guess the number ", B
40 IF A=B THEN PRINT "Correct": STOP
50 IF A<B THEN GO SUB 80
60 IF A>B THEN GO SUB 80
70 GO TO 30
80 PRINT "Try again"
90 RETURN
100 REM "An example of GO TO 7 and GO SUB 13 in quotes"
我想链接到ZX BASIC手册。我能找到的最好的似乎是http://www.worldofspectrum.org/ZXBasicManual/index.html,但这似乎是一个无效的链接。那个回程机器却有副本。
GOTO 100 + A*10,并且ZX Spectrum手册列表的附录CGO TO接受数字表达式(不限制常量)。这是在ZX80和ZX81 上计算的优点的讨论GOTO。顺便说一句,我不知道为什么在Spectrum版本中增加了空间。