PC/FORTH 循环

有限循环  DO  ...   LOOP
 
     先在   DO   之前指明循环终值循环初值,把需要重复执行的词放在  DO  和   LOOP   之间。
K1icBa73lXKhZYtMy7ppZTnEAceVdABfcMAzIoV0AG5QrI+AdbZBWE6DI+UAAAAABJRU5ErkJggg==
      循环中 循环终值 叫做"循环限"( Limit ),循环初值 叫做"循环下标" ( Index )。因此有限循环的一般格式:  Limit  Index  DO ……  LOOP
hV+y4Hn5sAAAAABJRU5ErkJggg==    
//循环下标和循环限可取的范围 -32768 ~ +32767
LOOP每次循环都是 +1 ; 可以在 I 操作的时候和数据栈中的数据做操作
W49UcdJdiBC1lqA8+y5KlP4i3oX83hBDYTYfxz+u+VrPyI77Cc1pLc34ED2ug8utuvS266lrScmJffdtRu78bAP9CvSPNN9cXWu2mwrzP9n4AwAAAAAAAAAAAAC4+QdX+4yVkgvpKAAAAABJRU5ErkJggg== //退出栈的时候清空数据栈


循环中的    IF   条件

  循环语句中的循环下标可作为 IF 语句的条件,这时你可以使某些操作在循环中的某个特定时刻执行。
P8nf+ztQx8EX7Dcr23Pwk6BwJU+BwNEMtvWAByyWiAXDIaIJeMBsglowFyyWiAXH8DvyObcofs1IMAAAAASUVORK5CYII=


嵌套循环

一个 DO ... LOOP  循环中嵌入另外一个  DO ... LOOP  循环
gMky+zp1DoBjAAAAABJRU5ErkJggg==

一个 DO 循环嵌套另外一 DO 循环
dogMRcAAAAAAAAAzPgfpAj+CHoL3FgAAAAASUVORK5CYII= //注意, I J  , J 表示的是外层循环下标,I 表示的是内存循环下标  
J 是把返回栈中的第三项复制到参数栈, I J *  就是把两个循环的下标相乘。5 U.R 是一种数据显示格式,5 表示表中每个数占据的位置,U.R 表示打印无符号数,向右对齐。
AdBfsMX2VUnjAAAAAElFTkSuQmCC



+LOOP

设置不让循环每次只+1;
:  PENTAJUMPS      50   0   DO   I   .   5   + LOOP ;    //每次下标加5

Jcf4BgIPzFw4SzwMURedHAAAAAElFTkSuQmCC

: FALLING      -10   0   DO   I   .   -1   +LOOP ;  

AFO+mMrNq2ytAAAAAElFTkSuQmCC

+LOOP  的增量可以来自任何地方,只要执行到  +LOOP  的时候数据处于栈顶。
定义循环的时候可以不用给出循环上下限和步长;
:  INC-CONT      DO   I   .   DUP   +LOOP  DROP;

c+unKlS8wUT3w24XOf9xekVIV6NaQp4BdT8kUd2tRXyEc0v6l+Sjibstyxl5RPUjP3Iu0IbVXpAS8eU6hx0W1M3Sq0n6p03C1lO3wom4XpyOE3eVD1T5TzSf6acdjsfyfWMwig03F7z22GMb17rLq03yiGYQ0jerbP1DvIBoBb9tg2zCuMLWke9g2HvdYpJKgBdbynz+P1CfUO47X+8BVDJuKoyWPnmGi4UnGXilrt9DeJJxzH1j3kl10wokq3JOXCdEI+DHX4tsX7WTez6r+De2t8K6Hgm4zSdvRA2h4kOf7wN0NkgLFAYDzHeQwjMsx7hZRrPl1Bzmkz70K4+IgR7iJw1zgfWAA4nLONTAAbwIEDEBgIGAAAgMBAxAYCBiAwPwBYE4i1EGYQ3UAAAAASUVORK5CYII= //执行过程是先在栈中压入1 5 0,再执行 INC-CONT 词,首先把 5 0 取出压入返回栈作为循环上\下限,然后执行到 DUP 的时候栈里只有数据 1 ,复制后作为循环步长,执行完 +LOOP 后删除复制的数据,保证最后栈中只有 1;
+59iLHHlq90AAAAASUVORK5CYII=

也可以在循环过程中每次改变循环步长
:  DOUBLING      32767   1   DO   I   .   I   +LOOP ;

9fBkF0+qXbdwnr55oEmf0wXlMtDgjpIXHCd5reOuCj+mOrr0Elpz6ZpvV6gvmQCjCMYF+s4VfSt7amYwD902DXFEXEGNG0d175+G5yXypn2eNtpUv7fCSGEkDirP3dCCCHkIWA6IYQQkgDTCSGEkASYTgghhCTwF3AfXtL9JJHEAAAAAElFTkSuQmCC

注意: 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 。
dEAAA1rL5PBACwOHAiAIAq4EQAAFXAiQAAqvgDFivzXJe2htcAAAAASUVORK5CYII=
这几个循环都和IF类似,xxx代表一段代码,不单单只一个词;f 表示一个逻辑操作,就像 0< 什么的。UNTIL 后面可以执行其他的操作。



不定的有限循环

如果要在循环中,尽管循环下标没有达到循环限,但当某种条件状态发生变化时便要求退出循环。
LEAVE , 这个词能够使循环执行下一个 LOOP 或 +LOOP 时立即退出。循环中遇到 LEAVE 的时候就会让循环下标等于循环限,下次执行 LOOP 时就会终止循环。
PfeNxlkj4AAAAASUVORK5CYII=

X+qiYP8BUohErXx2+AkAAAAASUVORK5CYII=
//我用的版本的 FORTH 中是   CLEARSCREEN   , QUIT  是清除返回堆栈,设置解释状态,接受从当前输入设备来的新输入。 eg :   :  100STARS      CLEARSCREEN  100  0  DO  STAR  LOOP ;   
7y0wzAANu62KPj4vafXPmOGgAAICJiWxd7dABADh0MADl0MADk+AErou+RIN1JdwAAAABJRU5ErkJggg==

转载于:https://www.cnblogs.com/meihao1203/p/10138181.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值