在rebol中有相当于“继续”(python)的东西吗?

时间:2013-09-07 13:36:24

标签: python rebol

我正在将一些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可能会有一些改进吗?

3 个答案:

答案 0 :(得分: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 [...]'continue 以避免抓住其他例外。甚至可以覆盖迭代器来为您透明地执行它,但代价是一些较慢的性能。

答案 1 :(得分:4)

CONTINUE不在Rebol2中。但它在Rebol3中运行得很好:

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

你会得到输出:

  

“这打印”,{HostileFork}说   “这打印”,{HostileFork}说。

据我所知,没有办法在Rebol2中实现一个继续。

好的,基于@ 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。

答案 2 :(得分:3)

在R2中,LOOP 1的工作量也比CATCH

loop 1 [
    print {"This'll print", {DocKimbel} said.}
    break
    print {"This won't print", {DocKimbel} said.}
    ]