5

我正在将一些 python 代码转换为 rebol,我刚刚遇到了一个“继续”指令。它中断循环的处理,进入循环的下一次迭代。

我觉得这个词非常优雅和可读。

我在那里遇到了一些答案:(法语),但没有什么真正“优雅”: http: //pl.legoff.free.fr/dotclear/vf/index.php/post/2003/01/05/Equivalent-d -un-Continue-ou-Next-dans-une-bouc 因为这个对话已经有 10 年的历史了,也许 Rebol 从那以后做了一些改进?

4

3 回答 3

6

您可以使用异常在 Rebol2 中执行此操作:

continue: does [throw 'continue]

loop 2 [
    catch [
        print {"This'll print", {DocKimbel} said.}
        continue
        print {"This won't print", {DocKimbel} said.}
    ]
]

如果您有自定义异常要在循环中处理,您可以使用/name细化,如catch/name [...] '继续避免捕获其他异常。甚至可以覆盖迭代器以透明地为您执行此操作,但会以一些较慢的性能为代价。

于 2013-09-07T14:46:06.730 回答
4

继续不在 Rebol2 中。但它在 Rebol3 中并且工作得很好:

loop 2 [
    print {"This'll print", {HostileFork} said.}
    continue
    print {"This won't print", {HostileFork} said.}
]

你会得到输出:

“这会打印出来”,{HostileFork} 说。
“这会打印出来”,{HostileFork} 说。

据我所知,没有办法在 Rebol2 中实现 continue。

好的,基于@DocKimbel 的回答,您可以在 Rebol2 中执行此操作:

old-loop: :loop

loop: func [count [integer!] block [block!]] [
    old-loop count [catch block]
]

continue: does [throw 'continue]

loop 2 [
    print {"This'll print", {HostileFork} said.}
    continue
    print {"This won't print", {HostileFork} said.}
]

注意:BREAK 和 CONTINUE 的内部实现方法确实使用了与 Rebol 中的 THROW 相同的机制......这是相对轻量级的,而不是异常处理。重要的是要知道 THROW不是您应该用于错误的……现代 Rebol 构建 ( Ren/C ) 甚至不允许您抛出一个。您应该改用 FAIL。

于 2013-09-07T14:11:29.687 回答
3

在 R2 LOOP 1 中也可以工作,开销比 CATCH 少

loop 1 [
    print {"This'll print", {DocKimbel} said.}
    break
    print {"This won't print", {DocKimbel} said.}
    ]
于 2013-09-08T08:43:00.533 回答