2013-09-07 3 views
5

Я конвертирую код 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 В этом converation не составляет около 10 лет, возможно, некоторые улучшения были сделаны в Rebol с тех пор?

ответ

6

Вы можете сделать это в Rebol2 с использованием исключений:

continue: does [throw 'continue] 

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

В случае, если у вас есть собственные исключения для обработки в цикле, вы можете использовать /имя утонченность как в поймать/название [.. .] 'продолжить, чтобы избежать других исключений. Можно даже переопределить итераторы, чтобы сделать это прозрачно для вас, но ценой более медленных действий.

+0

Параметр/имя уточнение не было настолько очевидно, он работал после некоторого RTFM, хотя: ' продолжают: делает [бросок/имя 'продолжить' keepgoing] повтора I 10 [улов/имя [ PRIN, если я (я = 5) [продолжить] I] прин keepgoing] ' возвращается: +112233445667788991010 , как и ожидалось. - pierre 5 мин. Назад – Pierre

4

ПРОДОЛЖЕНИЕ нет в 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 не то, что вы должны использовать для ошибок ... и современные сборки Rebol (Ren/C) даже не позволят вам его выбросить. Вместо этого вы должны использовать FAIL.

3

В R2 LOOP 1 тоже работает с меньшими затратами, чем CATCH

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

Да, но это не ведет себя так, как я хочу, и, как и python: continue не вырывается из цикла, он продолжает двигаться к следующим итерациям цикла. – Pierre