有限循环 DO ... LOOP
先在 DO 以前指明循环终值和循环初值,把须要重复执行的词放在 DO 和 LOOP 之间。
循环中 循环终值 叫作"循环限"( Limit ),循环初值 叫作"循环下标" ( Index )。所以有限循环的通常格式: Limit Index DO …… LOOP
//循环下标和循环限可取的范围 -32768 ~ +32767
LOOP每次循环都是 +1 ; 能够在 I 操做的时候和数据栈中的数据作操做
//退出栈的时候清空数据栈
循环中的 IF 条件
循环语句中的循环下标可做为 IF 语句的条件,这时你可使某些操做在循环中的某个特定时刻执行。
嵌套循环
一个 DO ... LOOP 循环中嵌入另一个 DO ... LOOP 循环
一个 DO 循环嵌套另一 DO 循环
//注意,
I
和
J
,
J
表示的是外层循环下标,I 表示的是内存循环下标
J 是把返回栈中的第三项复制到参数栈, I J * 就是把两个循环的下标相乘。5 U.R 是一种数据显示格式,5 表示表中每一个数占据的位置,U.R 表示打印无符号数,向右对齐。
+LOOP
设置不让循环每次只+1;
: PENTAJUMPS 50 0 DO I . 5 + LOOP ; //每次下标加5
: FALLING -10 0 DO I . -1 +LOOP ;
+LOOP 的增量能够来自任何地方,只要执行到 +LOOP 的时候数据处于栈顶。
定义循环的时候能够不用给出循环上下限和步长;
: INC-CONT DO I . DUP +LOOP DROP;
//执行过程是先在栈中压入1 5 0,再执行 INC-CONT 词,首先把 5 0 取出压入返回栈做为循环上\下限,而后执行到 DUP 的时候栈里只有数据 1 ,复制后做为循环步长,执行完 +LOOP 后删除复制的数据,保证最后栈中只有 1;
也能够在循环过程当中每次改变循环步长
: DOUBLING 32767 1 DO I . I +LOOP ;
注意: DO ... LOOP 循环至少执行一次,这两个词都是转义命令,所以只有在定义内部才能被执行。
tips:如何清除堆栈? 若是栈中无心存放了许多无用数据,可让FORTH解释一个不存在的词,这时候文本解释程序将执行词 ABORT ,从而清除两栈;
若是步长是负数,那么循环能够遍历的范围就是 [上限,下限 ];相反,若是步长是正数,循环范围就就是 [ 下限,上限);
不定循环
有循环上限的循环叫作有限循环。不定循环将无限重复或直到某一事件发生为止。
BEGIN ... UNTIL 循环重复执行或到某一条件为“真”时结束。当执行UNTIL时,当堆栈顶为假,就返回到BEGIN;
用法:BEGIN xxx f UNTIL ; 表示重复执行XXX ,直到 f 标志为真,若是为假就一直执行;
BEGIN XXX f WHILE YYY REPEAT
只要 YYY 为真就重复执行 XXX 不然结束循环。
BEGIN XXX AGAIN ; AGAIN 和 REPEAT 老是返回到 BEGIN 。
这几个循环都和IF相似,xxx表明一段代码,不仅仅只一个词;f 表示一个逻辑操做,就像 0< 什么的。UNTIL 后面能够执行其余的操做。
不定的有限循环
若是要在循环中,尽管循环下标没有达到循环限,但当某种条件状态发生变化时便要求退出循环。
LEAVE , 这个词可以使循环执行下一个 LOOP 或 +LOOP 时当即退出。循环中遇到 LEAVE 的时候就会让循环下标等于循环限,下次执行 LOOP 时就会终止循环。
//我用的版本的 FORTH 中是 CLEARSCREEN , QUIT 是清除返回堆栈,设置解释状态,接受从当前输入设备来的新输入。
eg :
: 100STARS CLEARSCREEN 100 0 DO STAR LOOP ;