迭代循环的形式为:
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
变体更不易读(哈!);没有任何好处。
是否可以使用NERFIN
从 n 到第1或0循环递减,其方式比具有UPPIN
或无操作形式的等价物更简洁循环?
我在语言规范级别1.2使用the lci interpreter。
答案 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部署的合适临时解决方案。