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

JB.*_*JB. 26 loops lolcode decrement

该规范的主题是什么:

迭代循环具有以下形式:

IM IN YR <label> <operation> YR <variable> [TIL|WILE <expression>]  
  <code block>
IM OUTTA YR <label>
Run Code Online (Sandbox Code Playgroud)

其中<operation>可以是UPPIN(递增1),NERFIN(递减1)或任何一元函数.该操作/函数应用于<variable>,它是临时的,并且是循环的本地.TIL <expression>将表达式计算为TROOF:如果它计算为FAIL,则循环再次继续,否则,循环执行停止,并在匹配的IM OUTTA YR <label>之后继续.WILE <expression>是相反的:如果表达式是WIN,则继续执行,否则循环退出.

我对规范的抱怨是:

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

据我了解,这意味着它必须从0开始.

虽然这对于大多数用途来说大多数都是可以的UPPIN,但对于大多数(我的)预期用途来说,它完全没有用NERFIN.我最常用的其他语言递减循环变量的用途是"重复ñ倍(ñ不能重新使用)"的成语和字符串操作,这将不会在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
Run Code Online (Sandbox Code Playgroud)

优点:简洁.
缺点:无法直接访问实际的循环变量.

使用无操作的变体:

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
Run Code Online (Sandbox Code Playgroud)

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

我能得到的最好的NERFIN:

IM IN YR LOOPZ NERFIN YR COWNTR TIL BOTH SAEM COWNTR AN -5
  VISIBLE SUM OF 5 AN COWNTR
IM OUTTA YR LOOPZ
Run Code Online (Sandbox Code Playgroud)

优点:错误......使用NERFIN
缺点:循环变量不能直接访问; 比UPPIN变体更不可读(哈!); 冗长无益.

TLDR问题,重复

是否有可能使用NERFIN一个循环减量从n减少到1或0的方式,其冗余程度比具有UPPIN无操作形式的循环更简洁?

我在语言规范级别1.2 使用lci解释器.

Hos*_*ork 14

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中),它仍然总是最初分配循环变量a 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
Run Code Online (Sandbox Code Playgroud)

不幸的是,有一个"效率黑客"阻止循环内的代码使用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部署的合适临时解决方案.

  • 我担心我们的CTO永远不会允许我们为生产中的翻译运行混合补丁级别.另一方面,我们非常严格的LOLCODING样式规则可能已经在理论上阻止所有兼容的代码进入这种边缘情况,因此我们可能只能修补和碰撞整个操作.您的补丁是否适用于航空航天和医疗应用?假设,请将您的咨询账单直接发送到会计. (13认同)
  • 可能适用于医疗应用,但航空航天测试一直......好,不确定:http://fc09.deviantart.net/fs44/f/2009/100/2/9/Flying_cat_23_by_haytapburcak.jpg (6认同)