PC/FORTH 循環

有限循環  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 ;   
相關文章
相關標籤/搜索