DO ... LOOP
总是至少执行一次。如果我想在 limit = index 时跳过执行,我可以将循环放入 if ... then
:
2DUP <> IF DO ... LOOP THEN
推荐的替代方案是
?DO ... LOOP
在最后一种情况下,
THEN
去了哪里?据我所知,?DO
单词包含一个不会闭合的 IF
。
单词
?do
可以通过do
定义如下。
: noop ( -- ) ;
: then, ( orig -- ) postpone then ;
: ?do ( -- do-sys )
postpone 2dup postpone =
postpone if postpone 2drop
postpone else
postpone do ['] then,
; immediate
: do ( -- do-sys )
postpone do ['] noop
; immediate
: loop ( do-sys -- )
>r postpone loop r> execute
; immediate
: +loop ( do-sys -- )
>r postpone loop r> execute
; immediate
有了这个
?do
,定义:
: foo ?do bar baz loop ;
编译为:
: foo 2dup = if 2drop do bar baz loop then ;