如果有必要,请对所有INTERCAL-72样式使用一个RESUME
如果需要编写等同于“ if”语句的内容,则使用INTERCAL-72代码的常规方法是NEXT
两次,然后执行一次calculated RESUME
。(在现代代码中,通常使用计算机COME FROM
将是更好的选择,但是本文提示您假设您的代码更喜欢NEXT
。)您几乎肯定要为第一个支付字节NEXT
,因为它从“ if”的一个分支跳转到另一个分支。共享第二个NEXT
也是不平凡的,除非您有很多“ if”语句在看到时都转到相同的位置#1
。但是,RESUME
可以在程序中的任何位置(因为控制将使其立即保留在任何位置)。
有两种方法可以解决此问题。如果您有很多“ if”语句,那么RESUME
可能需要保证一个数字的行号,以便您的第二条NEXT
语句可以尽可能短。如果可能的话,请尝试使其RESUME
自然地出现在您的代码中(当然,这很困难,因为很少有人出现在代码的“正常流”中而不是被其NEXT
接受);那么,唯一的成本就是行号。您必须为所有这些使用单个布尔变量NEXT
;这里的普遍共识是使用.5
,主要是因为它是标准库用于布尔返回值的变量。
另外,也可以使用标准库中未记录的(技术上记录不足,因为我在INTERCAL文档中放了一个提示)功能。由于a的中央位置RESUME
非常有用,因此标准库在内部使用一个。INTERCAL中的行号是全局的(具有命名空间约定,但是如果您知道自己在做什么,可以将其断开),因此,NEXT
如果需要,可以直接进入标准库的内部,尤其是可以NEXT
到达其中心RESUME位置。这在现有的INTERCAL代码中已经非常流行,以至于标准库替换往往必须实现它,以免破坏现有程序。
有问题的行是(从字面上看还是有效的,取决于实现):
(1001) DO RESUME .5
不使用它的主要原因是它的长行号。如果您需要做很多INTERCAL-72样式的if构造,最好使用您自己的方式为它提供较短的数字。
当然,您可以结合技巧,编写类似
(9)DO(1001)NEXT
仅略长于
(9)DORESUME.5
并具有布尔值变为#2
和的好处#3
(这很难阅读,但通常更易于生成)。实际上,甚至有必要添加额外的代码来处理,#0
并且#1
如果您会抱怨很多(但是COME FROM
在这种情况下,除非您的要求很奇怪,否则在这种情况下,计算机可能会更好地工作)。