2012年5月16日 星期三

JForthBlocks--控制結構do..loop

Jimmy's papa接下來要學習如何使用Forth的do..loop控制結構(Control Structure)積木,這類積木只能在定義(編譯)高階積木時使用,不能用在解譯時期,且do積木loop積木必須成對使用,do..loop積木之間可巢狀內含其他的do..loop積木,不過最多三層,因為Forth僅提供i j k三個迴圈計數索引(loop index)

為什麼只提供三個呢?或許長久以來Forth擅長用來開發短小精悍的應用,所以有人認為三個就夠用了,不過Jimmy's papa認為只提供這三個迴圈計數索引,可能是因為寄存在返回堆疊(Return Stack)的關係,某些書上還建議,操作堆疊的深度盡量避免超過三個

控制結構do..loop,可用的積木有..

do積木,從資料堆疊取上限值(limit)及起始值(startindex),至少會執行一次迴圈
?do積木,若上限值(limit)等於起始值(startindex),則不會執行迴圈
i積木,會將目前迴圈計數索引值從返回堆疊(Return Stack)複製到資料堆疊(Data Stack)
loop積木, 將迴圈計數索引值遞增1
+loop積木,從資料堆疊取遞增值,加總到迴圈計數索引值

Jimmy's papa先拉一拉積木作個實驗,讓程式從0開始跑10次迴圈,並將每次的索引值(loop index)推入資料堆疊,最後以.s積木列印在螢幕
寄件者 scratchlab02
執行結果會印出堆疊所有數值 0 1 2 3 4 5 6 7 8 9
寄件者 scratchlab02
這是產生出來的Forth原始碼
: test 10 0 do i loop ; test .s


接著測試?do積木,上限值(limit)及起始值(startindex)皆為0
寄件者 scratchlab02
執行結果,堆疊是空的(empty)
寄件者 scratchlab02
這是產生出來的Forth原始碼
: test 0 0 ?do i loop ; test .s


最後測試一下+loop積木,每次迴圈索引值(loop index)遞增3
寄件者 scratchlab02
執行結果
寄件者 scratchlab02
這是產生出來的Forth原始碼
: test 99 0 do i 3 +loop ; test .s

沒有留言:

張貼留言