2012年5月31日 星期四

JForthBlocks--用see積木幫有Create...Does>積木照張X光,果然有物件繼承的fu喔~~

Jimmy's papa查閱許多文件也看了JeForth的JS原始碼,一直搞不懂create...does>積木的運作原理,但為了搞懂如何做出Object-Oriented Forth,只好動用了Forth的X光機--see積木

底下的實驗Jimmy's papa做了個const高階積木,接著將0指定給a積木,1000指定給b積木,雖然目前用see積木還看不大清楚所有積木內部構造,但依實驗結果大約可知,const積木裡面的does>編譯後竟然變成does r>

而更有趣的是,a積木(ip位址在132)與b積木(ip位址在136)執行到最後,都會往前跳到ip位址127,也就是共用在does後面的r> @ >r r> exit,神奇吧!!!
寄件者 scratchlab02
寄件者 scratchlab02
寄件者 scratchlab02
這是產生出來的Forth原始碼,有空再附上註解
: const create , 0 , does> @ >r r> ; 0 const a 1000 const b see const see a see b create cc 11 , 22 , see cc ' const ' a ' b ' cc a b .s

2012年5月25日 星期五

JForthBlocks--向量表(VectorTable)

Jimmy's papa今天的學習內容,是如何製作向量表,這在寫C程式是很常見的技巧,大概就是將函式指標存在陣列供大同卻有小異的狀況下使用, 相關積木可參考 JForthBlocks--execute指令, JForthBlocks--variable & create積木的用法

Jimmy's papa簡單的拉拉積木,做了3個高階積木Binary, Decimal, Hexadecimal來將數字以不同進制印出,接著建立名為VectorTable的記憶體區塊, 並將上述3個高階積木的序號id存入
寄件者 scratchlab02
結果將數字16顯示為10000(二進制) 16(十進制) 10(十六進制)
寄件者 scratchlab02
這是產生出來的Forth原始碼,並附上註解
: Decimal 10 base! . ; \ 十進制
: Binary 2 base! . ; \ 二進制
: Hexadecimal 16 base! . ; \ 十六進制
\ 建立向量表儲存三個高階詞序號id
create VectorTable ' Binary , ' Decimal , ' Hexadecimal ,
16 dup dup \ 16複製3份
VectorTable @ execute \ 執行向量表第一個指令也就是Binary
VectorTable 1 + @ execute \ 執行向量表第二個指令也就是Decimal
VectorTable 2 + @ execute \ 執行向量表第三個指令也就是Hexadecimal

2012年5月23日 星期三

JForthBlocks--execute指令

Jimmy's papa今天測試execute指令,
先以 '積木測測看能否取得 *積木的序號id
寄件者 scratchlab02
取得*積木的序號id是6
寄件者 scratchlab02
接著將7與5推入堆疊,然後將序號id 6 挪到堆疊頂端,讓execute積木執行
寄件者 scratchlab02
最後執行結果是35,等同於執行 7 5 *
寄件者 scratchlab02
這是產生出來的Forth原始碼
' * .s 7 5 rot execute .