顯示具有 Forth 標籤的文章。 顯示所有文章
顯示具有 Forth 標籤的文章。 顯示所有文章

2013年3月19日 星期二

[Forth.js]中文程式碼漢字命名參考

Jimmy's papa發現在javascript裡,每個漢字unicode竟然佔字串長度8個字元,有興趣的網友可用alert("一二三到台灣".length)測測,看看回傳值真是驚人啊!!!理論上象形方塊字能夠承載更多意義,但是在電腦的世界使用漢字unicode卻沒有佔到多少便宜

所以,同功能的程式碼若以英文命名,可能只需8個字元,就足夠讓程式設計師分辨理解程式碼的意義,但是若以白話中文命名,以Jimmy's papa的經驗,每個程式碼命名至少需要2~5個中文字,也就是16~40個字元,才能寫出比較通順的中文程式碼...... (待續.....)

2013年3月14日 星期四

[Forth.js]如何使用JSON

c" {}" >json value 棒球隊
棒球隊 json> . 跳行

棒球隊 c" 綠巨人" json! 隊名
棒球隊 0 c" 詰生" json! 名字
棒球隊 0 c" 男" json! 性別
棒球隊 0 c" 伸卡球" json! 球種
棒球隊 0 c" 200公分" json! 身高 
棒球隊 0 c" 39" json! 年紀 

棒球隊 1 c" 浩客" json! 名字
棒球隊 1 c" 男" json! 性別
棒球隊 1 c" 曲球" json! 球種
棒球隊 1 c" 500公分" json! 身高 
棒球隊 1 c" 25" json! 年紀   
  
棒球隊 json> . 跳行
棒球隊 0  json@ 名字 . 跳行
棒球隊 1  json@ 名字 . 跳行

可將以上的符式程式碼貼到forthjs.appspot.com測測看,執行結果如下

2013年3月12日 星期二

[Forth.js]透過AJAX取得中文筆劃資料

Forth.js現在也可透過AJAX取得JSON資料,所以藉由善心網友提供測試的Chinese Character Web API(http://ccdb.hemiola.com/),Forth.js也可取得中文筆劃資料
c" http://ccdb.hemiola.com/characters/string/" value url
c" ?fields=kTotalStrokes" value urlp

create 姓氏表 c" 陳" , c" 王" , c" 劉" , c" 周" , c" 何" , 
 
: 姓氏表轉字串
c" "
5 for 
  5 r@ - 姓氏表 + @ strconcat 
next 
;

: 雲端取資料 ajax ;
 
: 變json物件 { 資料區域變數 }
 資料區域變數 >json 
;

url 姓氏表轉字串 strconcat  urlp strconcat false tick 變json物件 雲端取資料 

姓氏表 0 + @ . dup 0 json@ kTotalStrokes . .( 劃)  跳行
姓氏表 1 + @ . dup 1 json@ kTotalStrokes . .( 劃)  跳行
姓氏表 2 + @ . dup 2 json@ kTotalStrokes . .( 劃)  跳行
姓氏表 3 + @ . dup 3 json@ kTotalStrokes . .( 劃)  跳行
姓氏表 4 + @ . dup 4 json@ kTotalStrokes . .( 劃)  跳行

可將以上的符式程式碼貼到forthjs.appspot.com測測看,執行結果如下

2013年2月21日 星期四

詩經是甲骨金文程式碼?!孔子是編程祖師爺?!

Jimmy's papa最近一直注意某個宗教國學網,它提到古代經文書寫在竹簡上,如同現代程式設計師使用程式碼編輯器一般,可以很便利的執行Insert/Replace/Paste等編輯動作

甚至詩經裡某些看似單純描寫景物的詩句,經過象形化為甲骨金文,其實是變數宣告或引用(include)其他竹簡的段落的關鍵字(keyword)

初看這些論點會覺得超級話唬爛,小時候看一些國學大師在話玄學的書中,常常提到河圖洛書八卦是古代先秦文化裡多了不起的科技成就,但除了拿來算命外我卻看不到有何實際應用

不過,自從Jimmy's papa學過符式(Forth)程式語言一段時間後,深信只要有張桌面大的紙,邊邊畫上兩個堆疊陣列(大小應該不會超過20格),其餘的空白處規劃為字典表格,符式程式高手不需借助電腦便能人工紙筆演算起程式

所以,詩經是甲骨金文程式碼,我覺得不無可能,那麼,將周朝的三千多首詩,刪除整理為碼書詩三百還附上Package name,帶領儒團周遊列國的孔夫子是編程祖師爺,我也不覺得訝異

現在,Jimmy's papa每看到易經的六爻的變化順序,就越看越像符式的堆疊(Stack),呵呵!!!

2013年2月6日 星期三

[Forth.js]浮泡排序中文程式碼

Bubble-sort是學資料結構或演算法時,授課老師常會給的家庭作業之一,拿來練習寫符式中文程式碼
寄件者 圖片
寄件者 圖片
這是Jimmy's papa參考的Javascript程式碼
function bubbleSort(arr){
  var i=arr.length, j;
  var exchangVal;
  while(i>0){
    for(j=0;j<i-1;j++){
      if(arr[j]>arr[j+1]){
        exchangVal = arr[j];
        arr[j]=arr[j+1];
        arr[j+1]=exchangVal;
      }
    }
    i--;
  }
  return arr;
}


可將底下的符式程式碼貼到forthjs.appspot.com測測看
封 貢冊 993 , 566 , 885 , 333 , 788 , 111 ,

造詞 示列 { 陣列 陣列長 }   
 陣列長 0  
 週而
  陣列 i 加 汲 .
 復始
矣

造詞 浮泡排序 { 陣列 陣列長 }
 籌 目前位置 陣列長 給 目前位置
 起
 目前位置 
 若然
   目前位置  0 
   週而
     陣列 i 加 汲  陣列 i 加一 加 汲 雙複 大於
     若真
      換 陣列 i 加一 加 滯 陣列 i 加 滯 
     然後
   復始
   目前位置 減一 給 目前位置 
   陣列 陣列長 示列 
   跳行
 重蹈
矣
 .( 原順序--> ) 貢冊 6 示列 跳行 跳行  .( 排序... ) 跳行
 貢冊 6 浮泡排序 

2013年1月25日 星期五

[Forth.js]語境與虛詞--以詩經為範例

以下的符式詞(Forth words),可用來切換語境(context)

context ( <name> -- ) 語境
definitions ( -- ) 依境定義
also ( -- ) 目前的語境加入搜尋順序清單
onlyforth ( -- ) 回復最初的搜尋順序清單
defer ( <name> -- ) 虛詞
is ( xt <name> -- ) 是


Jimmy's papa最近對詩經及古文蠻有興趣地,所以在網路上找了兩種不同的詮釋,測測看虛詞在切換不同的語境下,是否會有不同的結果
show_code

defer 上帝板板
defer 下民卒癉


: 《詩經·大雅·生民之什·板》
 上帝板板 
 下民卒癉 cr
;

context 甲骨索隱 definitions also
: 解_上帝板板 ." 上帝為消滅罪孽將正本清源" ; 
: 解_下民卒癉 ." 乃因地上瞑盲奴隸被包裹起來見不著陽光" ;
: 轉甲骨索隱語境
 context 甲骨索隱 
 [tick] 解_上帝板板 is 上帝板板
 [tick] 解_下民卒癉 is 下民卒癉
 context Forth
;

context 朱熹詩集傳 definitions
: 解_上帝板板 ." 天反其常道" ;
: 解_下民卒癉 ." 而使民盡病矣" ; 
: 轉朱熹詩集傳語境 
 context 朱熹詩集傳 
 [tick] 解_上帝板板 is 上帝板板
 [tick] 解_下民卒癉 is 下民卒癉
 context forth
;

 .( [朱熹詩集傳語境] 上帝板板 下民卒癉--) 轉朱熹詩集傳語境 《詩經·大雅·生民之什·板》
 .( [甲骨索隱語境] 上帝板板 下民卒癉--) 轉甲骨索隱語境 《詩經·大雅·生民之什·板》

 


可將程式碼貼到Forth.js線上試玩版執行看看 forthjs.appspot.com
執行的結果應該如下
[朱熹詩集傳語境] 上帝板板 下民卒癉-- 天反其常道 而使民盡病矣
[甲骨索隱語境] 上帝板板 下民卒癉-- 上帝為消滅罪孽將正本清源 乃因地上瞑盲奴隸被包裹起來見不著陽光

2013年1月16日 星期三

[Forth.js]電話號碼解密遊戲

平常與Jimmy小子打完藍球,在回家的路上,Jimmy總會嘰哩呱啦講個不停,不是唱歌就是講同學告訴他的笑話,不然就是要我猜謎語, 有天說著說著忽然問起家裡的電話號碼,由於剛好走在小巷弄裡而且這小子講話音量也不低,靈機一動我就隨口回他

『耳朵 帆船 大肚 眼鏡 柺杖 鴨子 鉛筆』
他問我『什麼意思』
『幼稚園有教過』我說
他說『我不記得了』
『鉛筆1 鴨子2 耳朵3 帆船4 鉤鉤5 大肚6 柺杖7 眼鏡8 汽球9 球球 0』我說
他說『我不懂』
『這是密碼,你自己解碼』我說


小傢伙這時終於安靜一些,直到回家前都摸著小腦袋解碼
到家門口時,他說『爸,你說錯了,家裡的電話號碼不是那樣』
『嘿嘿....,我故意的』


回家後想想,這似乎可拿來做符式(Forth)程式練習


\ 電話號碼解密符式碼
alias ." 印" end_alias
: 鉛筆 印" 1"  ;
: 鴨子 印" 2"  ;
: 耳朵 印" 3"  ;
: 帆船 印" 4"  ;
: 鉤鉤 印" 5"  ;
: 大肚 印" 6"  ;
: 柺杖 印" 7"  ;
: 眼鏡 印" 8"  ;
: 汽球 印" 9"  ;
: 球球 印" 0"  ;

耳朵 帆船 大肚 眼鏡 柺杖 鴨子 鉛筆
可將程式碼貼到Forth.js線上試玩版執行看看 forthjs.appspot.com

以下是幼稚園流行的手指謠,有興趣的人也可用來加密

一根手指頭 , 一根手指頭 , 變丫變丫變成毛毛蟲
二根手指頭 , 二根手指頭 , 變丫變丫變成小白兔
三根手指頭 , 三根手指頭 , 變丫變丫變成小花貓
四根手指頭 , 四根手指頭 , 變丫變丫變成螃蟹走
五根手指頭 , 五根手指頭 , 變丫變丫變成拍拍手
六根手指頭 , 六根手指頭 , 變丫變丫變成打電話
七根手指頭 , 七根手指頭 , 變丫變丫變成神槍手
八根手指頭 , 八根手指頭 , 變丫變丫變成蜘蛛手
九根手指頭 , 九根手指頭 , 變丫變丫變成熱汽球
十根手指頭 , 十根手指頭 , 變丫變丫變成黃飛鴻

2013年1月9日 星期三

[Forth.js] 小學生中文程式教育網站

之前開發的JForthBlocks在平版上用起來不太順手 所以另外做一套簡單的工具,套用虛擬鍵盤的概念,將用到的符式詞(Forth words)都擺到鍵盤上, 方便平板的使用者(Jimmy)認識中文符式

目前還是非常陽春版,短期目標可能試寫一個塔防遊戲的簡單架構,然後讓Jimmy可以一個人修修改改, 這樣一來這個寒假就有事情讓他做啦!!就不會整天喊無聊哩!!! http://forthjs.appspot.com/

寄件者 圖片

2012年10月27日 星期六

將Forth當做Web Script?

底下兩段程式碼,可看到已經有人把Ruby與Processing移植到Web,將各自的指令語法或原始碼檔夾入HTML標籤,做為Web Script執行

由於現今Javascript已然成為Web Assembly,或許許多常見的程式語言皆可如此

<script type="text/ruby">
#class Foo; def initialize; @foo = 'whee'; end; end; f = Foo.new; f
Time.now
</script>
<script src="/processing.js"></script>
<canvas datasrc="blendColor.pjs" width="200" height="200"></canvas>


Jimmy's papa在想,如果其他程式語言都能成為網頁腳本,那對Forth來說應該也不成問題呀!

<script type="text/forth">
/ 試印出 99 乘法表
: x 9 for cr r@ 9 for dup r@ * 2 .r space next drop next ; x
</script>
或是
<script type="text/forth" src="/9x9.f"></script>
不過想歸想,實作時或許會遇到很多有趣的挑戰吧!!

2012年10月5日 星期五

[符式相關活動]魔法自走車 Arduino eForth 程式設計 研習 競賽 第一期活動已 開放報名

臺灣符式推廣協會正在舉辦『魔法自走車趣味競賽』,主辦單位還提供免費課程及器材,教大家如何以精幹剽悍的符式(Forth)語言控制硬體

可惜Jimmy's papa住在路途遙遠的高雄,否則也很想報名參加啊!!!

2012年9月21日 星期五

gForth--載入FFL(Forth Foundation Library)

FFL,一個通用的Forth詞庫(library),提供各類包括特殊資料型態,資料結構,雜錯與亂數,格式解析與檔案讀寫等等符式詞

Jimmy's papa已經玩好一陣子Forth,但總覺得沒有強大的library支援,就好像領導人背後沒有智庫運籌帷幄,事事校長兼撞鐘,實在成不了大事,所以今天抽空試試在Linux上執行gForth,然後執行FFL提供的範例,初步測試還蠻成功的

接下來,就是好好學習如何使用FFL了
寄件者 scratchlab02

2012年9月19日 星期三

JForthBlocks--測試有無DoLit的效能

在Forth裡DoLit指令是用來取字面值(literal)的巧妙機制,當定義高階詞時,如有字面值(literal)編入詞典時,會同時夾帶DoLit編入字面值(literal)的前一個位址,如此一來,當Forth執行到DoLit指令時,便會自動取下一個位址的字面值(literal),這技巧在以低階語言開發的Forth系統上很有效率

不過,JForthBlocks所依賴的以Javascript開發的JeForth,DoLit是否還保有同樣的優勢?

Jimmy's papa動手修改JeForth部份程式碼,再用JForthBlocks同一份積木程式,測試看看有無DoLit的效能,是否有很大的差異,底下是跑五百萬次迴圈的輸出結果,第一次跑出的結果,有無DoLit指令似乎只有幾百微秒(milliseconds)的差異,隨後兩次的結果,執行時間會爆增,或許是垃圾收集機制的干擾

首先,測試compilecode('doLit',n)的效能
        function call(xt){// high level definition inner execution loop
            highLevelLooping=true; ip=xt;
            do{
                var id=dictionary[ip++];
                //if(typeof(id)=='object'){var v=id['lit'];stack.push(v);continue;}
                ........
                ........            
            }
        }

        function exec(src){ //source code interpreting loop
            .....
            .....
            do{token=nexttoken(); word=token;
                var id=findword(token);
                ......
                ......    
                       if(typeof(n)==='string'||n<=0||n>0){
                        if(compiling)
                            compilecode('doLit',n);// compile an literal
                            //compilecode({lit : n});
                ......
                ......
            }while(error===0&&ntib<tib.length);}

          }
寄件者 scratchlab02
連續執行三次的結果




再來,測試compilecode({lit : n})的效能,執行時則統一由call(xt)代勞取字面值(literal)
        function call(xt){// high level definition inner execution loop
            highLevelLooping=true; ip=xt;
            do{
                var id=dictionary[ip++];
                if(typeof(id)=='object'){var v=id['lit'];stack.push(v);continue;}
                ........
                ........            
            }
        }

        function exec(src){ //source code interpreting loop
            .....
            .....
            do{token=nexttoken(); word=token;
                var id=findword(token);
                ......
                ......    
                       if(typeof(n)==='string'||n<=0||n>0){
                        if(compiling)
                            //compilecode('doLit',n);// compile an literal
                            compilecode({lit : n});
                ......
                ......
            }while(error===0&&ntib<tib.length);}

          }
寄件者 scratchlab02
連續執行三次的結果,看來三戰兩勝,以微幅差距領先



底下是積木的XML,可以貼到JForthBlocks的XML編輯區,便會將這次測試所用到的積木載入
<xml xmlns="http://www.w3.org/1999/xhtml">
  <block type="procedures_defnoreturn" notchtype="Top_Bottom_Right" inline="false" x="137" y="55">
    <title name="NAME">TestLiteral</title>
    <statement name="STACK">
      <block type="math_PushNumber" notchtype="TOP_BOTTOM">
        <title name="NUM">5000000</title>
        <next>
          <block type="control_ForNext" notchtype="Top_Bottom_Right" inline="false">
            <statement name="STACK">
              <block type="math_PushNumber" notchtype="TOP_BOTTOM_RIGHT" inline="false">
                <title name="NUM">0</title>
                <value name="NEXTWORD">
                  <block type="math_PushNumber" notchtype="LEFT_RIGHT" inline="false">
                    <title name="NUM">0</title>
                    <value name="NEXTWORD">
                      <block type="stack_2drop" notchtype="LEFT_RIGHT" inline="false"></block>
                    </value>
                  </block>
                </value>
                <next>
                  <block type="math_PushNumber" notchtype="TOP_BOTTOM_RIGHT" inline="false">
                    <title name="NUM">0</title>
                    <value name="NEXTWORD">
                      <block type="math_PushNumber" notchtype="LEFT_RIGHT" inline="false">
                        <title name="NUM">0</title>
                        <value name="NEXTWORD">
                          <block type="stack_2drop" notchtype="LEFT_RIGHT" inline="false"></block>
                        </value>
                      </block>
                    </value>
                  </block>
                </next>
              </block>
            </statement>
          </block>
        </next>
      </block>
    </statement>
  </block>
  <block type="utility_milliseconds" notchtype="LEFT_RIGHT" inline="false" x="89" y="289">
    <value name="NEXTWORD">
      <block type="procedures_callnoreturn" notchtype="LEFT_RIGHT" inline="false">
        <mutation name="TestLiteral"></mutation>
        <value name="NEXTWORD">
          <block type="utility_milliseconds" notchtype="LEFT_RIGHT" inline="false">
            <value name="NEXTWORD">
              <block type="stack_swap" notchtype="LEFT_RIGHT" inline="false">
                <value name="NEXTWORD">
                  <block type="math_Minus" notchtype="LEFT_RIGHT" inline="false">
                    <value name="NEXTWORD">
                      <block type="print_DotS" notchtype="LEFT_RIGHT" inline="false"></block>
                    </value>
                  </block>
                </value>
              </block>
            </value>
          </block>
        </value>
      </block>
    </value>
  </block>
</xml>

2012年9月11日 星期二

JForthBlocks--Linked List

目前JForthBlocks沒有高階的資料結構可用,或許過陣子引用其他現成的積木庫試試看效果如何,不過Jimmy's papa自己動手寫個簡單的連接串列,嗯!還蠻簡單的哩!!!

底下是配置ABCD四個記憶區塊,每個區塊都可儲存下一個連接地址與區塊紀錄的字串內容,ABCD區塊分別對應大野狼,大豬,二豬與豬小弟

不過區塊一多的話,就不能用這個法子,因為要幫每個區塊取名很麻煩!!!
寄件者 scratchlab02

2012年8月25日 星期六

JForthBlocks-以美味蟹堡當範例,八歲的Jimmy學如何使用堆疊指令

Jimmy's papa為了方便Jimmy小朋友能很快的進入狀況,以他喜歡看的卡通海綿寶寶當範例,先造好一些美味蟹堡製作手藝的中文程式積木,這樣一來他就可以專注在堆疊的操作學習上

在Jimmy小朋友邊try邊與我討論時,我也在觀察中文程式積木的命名,是否能讓小朋友快速理解單個積木的功能,再由多次嘗試錯誤的組裝過程,進一步對程式運作的原理心領神會

這段是Jimmy小朋友親自操作解說的


這整段是合集

2012年8月9日 星期四

JForthBlocks--Define Chinese High Word以中文定義新積木

之前JForthBlocks以中文定義新積木是無法執行,原因是引用中文積木時產生的Javascript code會有亂碼,Jimmy's papa已修正這個bug

寄件者 scratchlab02

2012年8月5日 星期日

JForthBlocks--POSTPONE與WORD的練習

這是Jimmy's papa試著解決網友提出的問題,順便當作自己的練習,也幫JForthBlocks補上了BL及WORD幾個積木

POSTPONE--可延遲立即詞(immediate words)在編譯狀態不會立即執行
WORD--依置於堆疊頂端的限定字元,解析WORD後面的字串,然後將解析好的字串置入堆疊
寄件者 scratchlab02
寄件者 scratchlab02
由於Mary尚未定義,所以不能編譯
寄件者 scratchlab02
在解譯狀態下,Mary可作為Greeting解析的對象
寄件者 scratchlab02

2012年6月23日 星期六

Try Google-Blockly & JeForth

Jimmy's papa目前試用Google-Blockly搭配JeForth,比起WaterBear,可以塞入更多的程式碼積木,Jimmy's papa也改寫了ContextMenu,可以切換不同方向的接槽(notch),讓Forth積木可實現橫式或直式兩種拼接風格,盡量有效的利用到PlayGround的有限空間,尤其以橫式拼接Forth積木時,總覺得我正在搞DNA序列哩,呵呵!!!

之前用WaterBear由於無法附上註解或說明,每次閱讀Forth積木時實在很是折磨腦細胞,而Google-Blockly已內建註解功能,為了讓Forth程式積木能夠更一目了然, 我特別製作了Comment積木,當直式拼接風格時,可嵌入程式積木右側

這是下圖的Forth原始碼,可印出費波那西數列(Fibonacci Sequence),參考自The Zen of Forth

: Fibonacci 1 swap 1 do dup . i swap +loop . ;
: Fibonacci2 1 swap 1 do dup . i swap +loop . ;
: Main 10 Fibonacci 10 Fibonacci2 ;

Main
寄件者 scratchlab02

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