回返堆疊(return stack),簡而言之,當Forth執行某個高階積木A時,中途需分心執行另一高階積木B,此時Forth會將此高階積木A目前執行的位置,擱置(暫存)於回返堆疊(return stack),等待高階積木B執行完畢之後再行取回,繼續執行此高階積木A尚未完成的工作
Forth程式設計師為了簡化資料堆疊(data stack)的操作,有時會在不影響回返堆疊(return stack)正常運作的情況下,暫時將資料移至回返堆疊(return stack),然後盡快將回返堆疊(return stack)的資料移回資料堆疊(data stack)
以下是操作回返堆疊相關積木說明
>r ( n -- ) \ 取出資料堆疊(data stack)頂端之數,將它移到回返堆疊(return stack)的頂端
r> ( -- n ) \ 取出回返堆疊(return stack)頂端之數,將它放回資料堆疊(data stack)的頂端
r@ ( -- n ) \ 複製回返堆疊(return stack)頂端之數,放到資料堆疊(data stack)的頂端
需注意
1. 在編譯模式下才能使用
2. >r 與 r>必須要成對的使用
在JForthBlocks的Stack目錄可找到>r,r> 與r@三塊積木
寄件者 scratchlab02 |
在資料堆疊(data stack)先推入數值1,2,3
然後將3移到回返堆疊(return stack)的頂端
寄件者 scratchlab02 |
寄件者 scratchlab02 |
於是Jimmy's papa,在Compile目錄找到這兩個積木
寄件者 scratchlab02 |
重新組裝後執行
寄件者 scratchlab02 |
執行結果告知有error,回返堆疊(return stack)是有借有還再借不難,可不是雜物堆哩!!!
寄件者 scratchlab02 |
再用 r> 試試看從回返堆疊(return stack)取值
寄件者 scratchlab02 |
順便加個 .s 積木,了解一下資料堆疊(data stack)狀況
寄件者 scratchlab02 |
結果資料堆疊(data stack)頂端多了個不明資料
寄件者 scratchlab02 |
將 >r 與 r>成對擺放試試看
寄件者 scratchlab02 |
嘿嘿,做虛工,資料堆疊(data stack)狀況不變
寄件者 scratchlab02 |
夾帶一個 r@ 積木看看
寄件者 scratchlab02 |
嘿嘿,資料堆疊(data stack)頂上多個3
寄件者 scratchlab02 |
試試看倒轉資料堆疊(data stack)數值1,2,3的順序
寄件者 scratchlab02 |
OK!成功
寄件者 scratchlab02 |
沒有留言:
張貼留言