有限循環 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 ;