JB.*_*JB. 26 loops lolcode decrement
迭代循环具有以下形式:
IM IN YR <label> <operation> YR <variable> [TIL|WILE <expression>]  
  <code block>
IM OUTTA YR <label>
其中<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
优点:简洁.
缺点:无法直接访问实际的循环变量.
使用无操作的变体:
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变体更不可读(哈!); 冗长无益.
是否有可能使用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
不幸的是,有一个"效率黑客"阻止循环内的代码使用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部署的合适临时解决方案.