2012年6月6日 星期三

JForthBlocks--以Create...Does>造立即詞(Immediate word)

這是Jimmy's papa在網路上看到的技巧,這是利用Create...Does>造新詞之際,順便註記為立即詞(Immediate word),以下做兩個小範例,分別比較有無使用immediate積木的差別
寄件者 scratchlab02
結果可以看到y:之後沒有10,因為10已經早於y:偷跑(編譯時期)推入堆疊了
寄件者 scratchlab02
這是有用到immediate的Forth原始碼,附上註解
: constx
create \ 將記憶體區塊位址指定給新詞
immediate \ 註記新詞為立即詞
, \ 將堆疊頂端數值存入記憶體區塊位址之後
does> \ 將後續位址設為新詞的執行位址
@ ; \ 取出記憶體區塊內存值
10 constx ten \ 10指定給ten,而ten是立即詞,執行ten會將10推入堆疊
: y s" y:" ten ; \ ten於編譯時期立即執行將10推入堆疊,不會編入y
: z s" z:" postpone ten ; \ ten雖是立即詞但被強迫編入z
ten \ 將10推入堆疊
y
z \ 將10推入堆疊
.s \ 印出堆疊內容
寄件者 scratchlab02
因為不是立即詞,所以10都是中規中矩的在執行(解譯)時期推入堆疊,不會偷跑
寄件者 scratchlab02
這是沒用到immediate的Forth原始碼,附上註解
: constx
create \ 將記憶體區塊位址指定給新詞
, \ 將堆疊頂端數值存入記憶體區塊位址之後
does> \ 將後續位址設為新詞的執行位址
@ ; \ 取出記憶體區塊內存值
10 constx ten \ 10指定給ten,執行ten會將10推入堆疊
: y s" y:" ten ; \ ten編入y
: z s" z:" postpone ten ; \ ten編入z
ten \ 將10推入堆疊
y \ 將10推入堆疊
z \ 將10推入堆疊
.s \ 印出堆疊內容

沒有留言:

張貼留言