由于rebol3 标签,我假设这个问题与 Rebol 3 有关。
为 Rebol 3 提议的“CFOR”
对于 Rebol 3,有一个非常类似于 C 风格 for 的“通用循环”的提议(得到了相当多的支持),因此目前使用 cfor 的名称还有:请参阅CureCode issue #884 了解所有血腥细节。
这包括对 Ladislav 的原始实现的改进版本,为了便于参考,我将在此处复制当前(截至 2014 年 5 月 17 日)版本(没有广泛的内联 cmets 讨论实现方面):
cfor: func [ ; Not this name
"General loop based on an initial state, test, and per-loop change."
init [block! object!] "Words & initial values as object spec (local)"
test [block!] "Continue if condition is true"
bump [block!] "Move to the next step in the loop"
body [block!] "Block to evaluate each time"
/local ret
] [
if block? init [init: make object! init]
test: bind/copy test init
body: bind/copy body init
bump: bind/copy bump init
while test [set/any 'ret do body do bump get/any 'ret]
]
Rebol 3 中用户级控制结构实现的一般问题
对于 Rebol 3 中控制结构的所有用户级实现的一个重要的一般性评论:在 R3 中还没有类似于 Rebol 2 的 [throw] 属性(参见 CureCode issue #539),所以这种用户编写的(“夹层” ,在 Rebol 术语中)控制或循环功能通常存在问题。
特别是,此 CFOR 会错误地捕获 return 和 exit。为了说明,请考虑以下函数:
foo: function [] [
print "before"
cfor [i: 1] [i < 10] [++ i] [
print i
if i > 2 [return true]
]
print "after"
return false
]
您会(正确地)期望 return 实际上从 foo 返回。但是,如果您尝试上述方法,您会发现这种期望令人失望:
>> foo
before
1
2
3
after
== false
这句话当然适用于所有在这个线程中作为答案给出的用户级实现,直到错误 #539 被修复。