LOLCODE中的NERFIN循环操作有什么用?

时间:2011-05-25 13:12:32

标签: loops decrement lolcode

What the spec says on the subject:

  

迭代循环的形式为:

IM IN YR <label> <operation> YR <variable> [TIL|WILE <expression>]  
  <code block>
IM OUTTA YR <label>
  

其中&lt; operation&gt;可能是UPPIN   (递增1),NERFIN(递减   一个),或任何一元功能。那   操作/功能适用于   &lt; variable&gt;,这是临时的,和   循环本地。 TIL   &LT;表达&GT;评估表达式   作为TROOF:如果它评估为失败,   循环再次继续,如果没有,   然后循环执行停止,并且   在匹配的IM OUTTA之后继续   YR&lt; label&gt;。 WILE&lt;表达式&gt;是   反过来:如果表达式是   WIN,继续执行,否则   循环退出。

问题

我对规范的抱怨是:

的组合
  • 缺少循环变量初始化程序
  • 事实上它是循环的临时和本地

据我了解,这意味着 从0开始。

虽然这对UPPIN的大多数用途来说基本上都没问题,但对NERFIN的大多数(我的)预期用途来说完全没有用。我在其他语言中使用递减循环变量的最常见用法是“重复 n 次( n 未重复使用)”习语和字符串操作,这不是无论如何,在LOLCODE中一个好主意。

是否可以使用NERFIN n 到第1或0循环递减,其方式比具有UPPIN或无操作形式的等价物更简洁循环?

替代品的比较

使用UPPIN变体打印5 4 3 2 1:

IM IN YR LOOPZ UPPIN YR COWNTR TIL BOTH SAEM COWNTR AN 5
  VISIBLE DIFF OF 5 AN COWNTR
IM OUTTA YR LOOPZ

优点:简明扼要。
缺点:实际的循环变量无法直接访问。

使用无操作的变体:

I HAS A COWNTR ITZ 5
IM IN YR LOOPZ
  VISIBLE COWNTR
  COWNTR R DIFF OF COWNTR AN 1
  BOTH SAEM COWNTR AN 0, O RLY?
  YA RLY, GTFO, OIC
IM OUTTA YR LOOPZ

优点:循环变量可直接使用。
缺点:更长。

我可以使用NERFIN获得最佳效果:

IM IN YR LOOPZ NERFIN YR COWNTR TIL BOTH SAEM COWNTR AN -5
  VISIBLE SUM OF 5 AN COWNTR
IM OUTTA YR LOOPZ

优点:错误...使用NERFIN
缺点:循环变量无法直接访问;比UPPIN变体更不易读(哈!);没有任何好处。

TLDR问题,重复

是否可以使用NERFIN n 到第1或0循环递减,其方式比具有UPPIN或无操作形式的等价物更简洁循环?

我在语言规范级别1.2使用the lci interpreter

1 个答案:

答案 0 :(得分:13)

2007年就这个确切的主题进行了设计讨论。当时的共识似乎建议添加FROM作为解决方案,工作组希望快速进入1.2:

http://forum.lolcode.com/viewtopic.php?pid=2484

该问题已经提交,并没有进入1.2规范。但是,它显然在1.3规范中:

http://lolcode.com/proposals/1.3/loop2

尽管如此仍在进行中。我查了一下,它还没有在存储库的“future”分支中。我们可以通过查看循环解释器代码来看到这一点。截至2011年8月24日(在修订版72c983d0667d4d650657e1b7c5f4c7054096b0dd中),它始终始终将循环变量赋值为NUMBR 0:

https://github.com/justinmeza/lci/blob/72c983d0667d4d650657e1b7c5f4c7054096b0dd/interpreter.c#L3434

然而,即使使用旧的规范,理论上理论上也可以将TROOF与-1的测试结合使用,以允许从5到0的相对干净的倒计时形式:

BTW countdown-test.lol
CAN HAS STDIO?
HAI 1.2

HOW DUZ I COUNTDOWN YR BOWNDZ
    I HAS A FIRSTIES
    FIRSTIES R WIN
    IM IN YR LOOPZ NERFIN YR COWNTR TIL BOTH SAEM COWNTR AN -1
        FIRSTIES
        O RLY?
            YA RLY
                COWNTR R BOWNDZ
                FIRSTIES R FAIL
        OIC

        VISIBLE COWNTR

    IM OUTTA YR LOOPZ
IF U SAY SO

COUNTDOWN 5

KTHXBYE

不幸的是,有一个“效率黑客”阻止循环内的代码使用R修改循环变量:

https://github.com/justinmeza/lci/blob/a6ef5811e8eb98935a16600b799bccbe4adffdde/interpreter.c#L3408

然而,由于这似乎是代码中的一个错误而不是规范中的遗漏,因此更有可能在1.3发布之前得到修复。修补interpreter.c以说if (0 && stmt->update->type == ET_OP)会使countdown-test.lol的代码按预期运行。如果您不必与未修补的安装共享代码,它可能是现有1.2 LOLCODE部署的合适临时解决方案。

相关问题