2012年1月15日 星期日

產前迎生慶祝活動(Baby shower)

曾慶潭2012-01-16於紐西蘭
Ching-Tang Tseng
ilikeforth@gmail.com
http://forthfortnight.blogspot.com

中國人迎接新生命的到來,以初生嬰兒滿月來慶祝。西方文化不同,以預計嬰兒出生前的一個月左右,舉辦產前迎生慶祝活動來慶祝。創造宇宙繼起的生命,絕對是一件偉大的事情,所以應該慶祝,事前、事後慶祝,都是慶祝。
大女兒預計下個月生產,於是小女兒就為此事,協助大女兒張羅了這麼一次的慶祝活動,忙了幾天,愉快的辦好了一次迎生慶祝活動。習慣上,那是女人家的活動,而且以女婿家的來人為主,我這個老男人只好退居一旁,忙我自己的事情。
現代人挑選的黃道吉日,不是去看黃曆,放假期間最為吉祥,大部份人都方便參加活動的日子,就是黃道吉日。一月十四日就是這麼一個日子,家中一次來訪將近二十個婦人,熱鬧非凡。
我對一些事務,看法與做法常與一般人不同,但只要理由正確,就大可不必在乎別人的觀點如何?儘管放心去做。女兒結婚時,放任她一切自己作主,婚宴她自辦,不必邀請我們為人父母這方面的客人。理由是我們移民在外,沒有必須向親屬長輩交待事務的問題,因此而不必欠下與親朋好友來往時的傳統人情。女兒自行料理一切事情,終身都能為自己的自主成果,留下得意的回憶。這次的迎生慶祝活動亦然,她自己作主。

藉著這麼一個迎生慶祝活動的主題,我也可以引申出幾個迎接新狀況的題材,寫進這篇文章。
迎生慶祝活動當然留下了許多照片,照的都是她們得意的傑作,女兒會貼進她自己的臉書與網頁,各位親朋好友若有興趣,就請自行前往觀賞。我這裡則在其他方面,也來迎接一些新生事物,與介紹剛開發出來的FORTH新氣象。

首先一個最大的主題,是我這星期才完成的『3D函數繪圖程式』。它不容易完成,我詳細讀完手頭所擁有的論文資料,參考古聖先賢所寫的程式後,足足花了三天,才完成使用ABC FORTH數學計算系統寫成的程式。
接下來又花費了幾天的時間,測試程式執行效果,並發現了幾個出問題的地方,必須進行除錯修正。迎生慶祝活動當天,落定了所有的設計,『3D函數繪圖程式』就將誕生。剩下來的程式設計工作,只是為了美化輸出,選用適當比例的設定參數,用於開啟視窗,並在其中按指定比例繪圖。此事只宜在親眼目睹輸出效果後,採用回饋設計的方式來完成,需要再花一點時間。
以前,從事於科學研究工作時,對科研程序有點認識。從事科研工作者,在準備開始進行一項新的研究主題時,千萬不要自以為馬上就可以成為諾貝爾獎的得主,而直接搞些前人從未搞過的爆炸性研發,否則失敗的居多。我這次發展『3D函數繪圖程式』,也是抱持著正常心情而發展,最後,才能成功。
寫研究論文時,都要引用參考文獻,它表示了從事研究者,已經搞清楚了前人的技術,也有能力重新再現同樣的研究,然後才有這篇論文裡更上一層樓式的創新報告。這篇文章雖然不是論文,但能夠進行類似的描述,寫出結果,表示程式的發展經過,與寫論文之進行方式,是完全相同的。
三年前,第一個用來試用ABC FORTH數學計算系統的測試程式,就是平面上的2D函數繪圖程式,它曾以寫成單篇獨立網文的方式,刊載於此網頁。這三年來,網文中已有不少刊出的圖形,是使用該程式完成的。
圖形最能表示函數變化的趨勢,卻不強調絕對精確的數值。同理,3D的函數圖形,也是一樣,以表現函數變化趨勢為主,不強調精確數值。
三十幾年前,我就設計過函數繪圖程式,那時的電腦軟硬體性能都不太好,有時,單純只為繪出一幕3D函數圖形,就得耗費一個小時以上,因為程式中難免帶有大量的投影座標換算計算。為了讓顯示圖形較為清晰,都希望將位於圖形後面的隱藏線處理掉,那麼,就得再度進行一大堆、一長串的比較與計算,然後再以程式執行一點一點的反白繪圖消除工作,去除背後的隱藏線,繪完一張全圖的時間,就會更長。
那個年代,繪完一圖,因難能可貴,都必須立即將結果存成圖形檔案,再用印表機印出一張圖來留念。說實在的,對顯示圖的趨勢感,有時仍然難以建立,圖的品質也不太好。
今天,我重新完成一套設計,感覺已經完全不一樣了。以前用的是買來的軟體系統,今天,使用的是自己設計出來的ABC FORTH系統。
以前的顯示性能較差,解析度很低,現在的顯示性能則改善了許多,色彩與解析度都更好了。
以前每次執行程式,只能得到一張圖,現在,我粗略的測試,繪出一張一般性圖形,使用XP作業系統中ABC FORTH設計出來的程式,耗時僅約0.078秒,神速無比。這樣的新環境,引誘我來設計出動態顯示新程式了。
從設計出來的顯示效果中,可以很容易的體會出3D圖形所能表現的景觀,趨勢感就非常強烈,使用者就能快速調整出最適當的鳥瞰角度,將圖形固定下來,存檔留參。
以這一套工具來繪製三度空間的函數圖形,速度之快,幾乎可以說是立即就能獲得結果,因此有著無限的應用潛力。
輸入的函數,只需按照教室課堂上,老師寫在黑板上的數學式子輸入,而且只需寫成一列便可,這種函數有無限多種。
這套工具可以用於教學,是動態顯示式的教學工具,能為學生建立強烈的函數圖形實際觀念,是萬用的程式。
如果某人很有藝術眼光,喜歡設計,那麼,這一套工具能夠協助他,快速產生大量的藝術圖形,供作藝術設計之用。
許多科學研究以三度空間來表示時,就能快速找到關鍵數據。我已將程式除錯到運作起來沒有問題的地步了,當然就適合用於實際的科學研究。

我所設計的ABC FORTH數學計算系統,並不能普及性的被大家使用,我也不想浪費時間去搞推廣,中華民國台灣,想不想利用這個免費的資源來教育我們的下一代?非我所能主使,但我也不在乎。從網文的敘述中,讀者應該很容易體會,我自己已經可以享受各種設計成果的樂趣了,這才是樂觀的實際人生。
我始終想搞地震早期警報監測系統的偵測研究,但沒錢買硬體,這幾天有個念頭,想要自己製造超低聲頻的探頭,這沒甚麼大不了的,以前曾參與國防方面的研究,美國人不賣關鍵性偵測元件給我們的時候,我們不也都是這樣子自立自強嗎?後來反而更能走出自己的一片天地。
家兄是個外交官,這幾天也開始利用我所設計的語音輸出系統,作為講稿評鑑工具,或用來聽取自動讀出的訊息。我的同胞不重視這些發展成果,又有什麼關係呢?我有一本待出版的新書,書中記錄了不少有意義、有價值的技術,我不能確定書商是否誠心誠意的想為國人而出版?我想,這也不很重要,這幾個月,我在設計程式時,就已經不斷的必須回頭參考我自己寫成的這一本新書,它已經成為有用的工具。如果這本書不能以實體書與大家見面,我就將其收歸己有,絕不考慮以電子書的方式出版,以免糟蹋這種技術產品。
同胞們,有骨氣一點,自己的事務要靠自己打點,我在樂於回報自己的國家與社會時,請不要輕忽這些微小的貢獻,如果國人事事都仍輕忽看待,長此以往,國家也只好走向滅亡一途。

此處就以由簡入繁的方式,刊載幾張顯示不同效果的3D函數圖。我喜歡設計出有用的萬用工具,卻不喜歡沉迷於五彩繽紛的花樣結果中,因此,只展示黑白圖形,以表示對數學函數的尊重。

第一組兩張圖,表現一個精簡函數:

40 LET { Z = -2 * exp ( sin ( X * Y ) ) + 4 }

經由3D繪圖程式繪出函數圖形後,如果不能進行快速的旋轉動態顯示,那麼,輸入下列數據後,只能得到圖一的結果。

如果您想更為仔細的審視本網文中所刊載的任一圖示或照片,請用滑鼠就在圖面上點選一次,另一個以全黑為背景,正中央顯示更清晰圖樣的畫面,就可以呈現在您眼前。不想再看時,以滑鼠點選全黑畫面右上角的打叉圖示,就能自動恢復成現行畫面。

不離開此畫面,直接操作control+或control-,則能就地放大或縮小整篇內容的顯示,包括所有的圖示。

歡迎來訪讀者試用。

main
Enter X range ... Minimum Maximum(separated by a blank):? -2 2
Enter Y range ... Minimum Maximum(separated by a blank):? -2 2
Enter Z range ... Minimum Maximum(separated by a blank):? -2 2
Enter tilt angle(degrees):? 45
Enter rotation angle(degrees):? 45
Enter number of x lines to plot:? 50
Enter number of y lines to plot:? 50
Want hidden line removal(y/n)?
Yes
Elapsed time: 21:08:57.484
Elapsed time: 21:08:57.562 ok

圖一


我所設計的系統,可以快速動態的處理出,由各種不同鳥瞰角度顯示之結果。立即進行快速的操作,便能得到自覺比較滿意的顯示圖形。圖二顯示了由原始設定為旋轉45度及仰角亦為45度的角度,變換到旋轉為19度而仰角為312度時,看起來比較美觀的圖示。
最後被固定繪出之圖,有點像海中的大魟魚(Stingray),在前曾貼出的網文:『開懷大笑』文末,有這種魚的實際照片,讀者不妨再去那裡觀賞一次,牠生的蛋有點特別,是方蛋。

output-data
XMIN, XMAX = -2.000000000 , 2.000000000
YMIN, YMAX = -2.000000000 , 2.000000000
ZMIN, ZMAZ = -2.000000000 , 2.000000000
TILT, ROTA = 312.0000000 , 19.00000000
XLINES, YLINES = 50 , 50
REMOVE = 1 ok

圖二



第二組展示圖,是一組經常被用來展示3D繪圖性能的精簡函數:

40 let { z = 10 * sin ( x ) * cos ( y ) }

它顯示的形狀類似一個波浪面。我們仍然採用上述方式,來顯示快速動態操作出結果的不同,以便讓大家體會程式性能上的差異。圖三已經繪出了3D曲面的圖形,而且上視面與下視面的線條有明顯的不同,所有背後的隱藏線,都被澈底的處理掉了。但是由旋轉與仰角均為45度的鳥瞰角度來顯示,效果依然不太好。

main
Enter X range ... Minimum Maximum(separated by a blank):? -5 5
Enter Y range ... Minimum Maximum(separated by a blank):? -5 5
Enter Z range ... Minimum Maximum(separated by a blank):? -5 5
Enter tilt angle(degrees):? 45
Enter rotation angle(degrees):? 45
Enter number of x lines to plot:? 50
Enter number of y lines to plot:? 50
Want hidden line removal(y/n)?
Yes
Elapsed time: 21:18:42.828
Elapsed time: 21:18:42.906 ok

圖三



設計完成的程式,可以快速動態操作出理想的結果,操作最終之數據與圖示如下:

output-data
XMIN, XMAX = -5.000000000 , 5.000000000
YMIN, YMAX = -5.000000000 , 5.000000000
ZMIN, ZMAZ = -5.000000000 , 5.000000000
TILT, ROTA = 297.0000000 , 39.00000000
XLINES, YLINES = 50 , 50
REMOVE = 1 ok

圖四



為了能夠更為明顯的區分出處理隱藏線後的效果,我刻意再將無此功能的3D繪圖方式展示如下:圖五是只能直接繪線,不能處理隱藏線的顯示圖,品質確實差多了。就算能夠快速動態操作出適當的鳥瞰角度後,改善的情況則仍然有限,如圖六所示。

將圖五、圖六這一組圖,與圖三、圖四那一組圖直接比對,讀者應該能夠體會,處不處理隱藏線?效果上的明顯差異了。

main
Enter X range ... Minimum Maximum(separated by a blank):? -5 5
Enter Y range ... Minimum Maximum(separated by a blank):? -5 5
Enter Z range ... Minimum Maximum(separated by a blank):? -5 5
Enter tilt angle(degrees):? 45
Enter rotation angle(degrees):? 45
Enter number of x lines to plot:? 50
Enter number of y lines to plot:? 50
Want hidden line removal(y/n)?
No
Elapsed time: 21:26:08.171
Elapsed time: 21:26:08.203 ok

圖五



調整角度後的數據輸出報表及圖六,如下所示:

output-data
XMIN, XMAX = -5.000000000 , 5.000000000
YMIN, YMAX = -5.000000000 , 5.000000000
ZMIN, ZMAZ = -5.000000000 , 5.000000000
TILT, ROTA = 307.0000000 , 33.00000000
XLINES, YLINES = 50 , 50
REMOVE = 0 ok

圖六



我僅只在本文中舉出兩個非常簡單的函數來繪圖,而這個程式卻是萬用的,只要是合理能計算的函數,都能使用這個程式繪出圖形。
我在試用程式性能期間,深深的體會出若想獲得好圖,關鍵決定於輸入選擇範圍的參數上。
執行這些程式時,會形同吃了嗎啡似的,一直沉迷於欣賞自己創作出來的顯示結果,因而浪費掉許多時間。

圖一與圖二,是從一個較為複雜圖形中,選定一小區域範圍後,所繪製出來的3D單純圖形,它的大範圍圖示表現欠佳,就如圖七所示,調整出圖八,則尚差強人意。讀者可藉第三組這兩張特別的圖示,體會如何從複雜圖形中選定範圍?以切割出一小片區域,來獲得理想顯示圖形的方法。

main
Enter X range ... Minimum Maximum(separated by a blank):? -10 10
Enter Y range ... Minimum Maximum(separated by a blank):? -10 10
Enter Z range ... Minimum Maximum(separated by a blank):? -2 2
Enter tilt angle(degrees):? 45
Enter rotation angle(degrees):? 45
Enter number of x lines to plot:? 50
Enter number of y lines to plot:? 50
Want hidden line removal(y/n)?
Yes
Elapsed time: 07:29:10.000
Elapsed time: 07:29:10.062 ok

圖七



快速操作調整鳥瞰角度成下列數據後,得到了比較能顯示全盤趨勢的3D曲面顯示圖形,如圖八所示。

進行整個操作,將結果黏貼進這篇文章,僅只是幾分鐘的事情。

output-data
XMIN, XMAX = -10.00000000 , 10.00000000
YMIN, YMAX = -10.00000000 , 10.00000000
ZMIN, ZMAZ = -2.000000000 , 2.000000000
TILT, ROTA = 88.00000000 , 41.00000000
XLINES, YLINES = 50 , 50
REMOVE = 1 ok

圖八



實際上,這一套程式是在W7ABC635Win32for.exe中發展而成,我已開始適應64位元電腦的使用環境,並進行程式發展,後續還有許多的新性能,等著我去體會,例如:以多CPU執行FORTH程式的效果。
我還有新的數學計算程式發展計劃,『3D函數繪圖程式』的發展必須早點結束,成果則留待將來必要時使用,這是一套新誕生的工具程式,這篇網文記述了這個程式在產前迎生慶祝活動過程中所繪出之圖形。

第二個主題,不必那麼約束,改談其他話題。

幾個月前才剛栽種的蘋果樹,高度還不及一公尺,卻開了花,結了果。曾在此網頁於2011-11-02刊出的『忙著搞生產』一文中,顯示這棵剛種的蘋果樹開滿了鮮花。後來,小樹無法負荷那麼多的果子,只好大量落花,最後,竟然還是結成了一顆果子,我為這顆即將到來的新蘋果,命名為『蘋太郎』,也特別寫進網文,刊列圖九照片,刻意慶祝。
產前迎生慶祝活動,大部份只在第一胎嬰兒到來之前,母親才比較有興趣舉辦慶祝活動,這顆蘋果與這棵蘋果樹,又何嘗不是如此?明年的『蘋次郎』、『蘋三郎』,甚或是『蘋五十六』,我大概就不會有興趣再這樣介紹給大家了。
蘋果樹旁的小藍莓,果子也成熟了,我每天見牠發藍時,摘了就吃,享受最自然的人生。

圖九

2012/2/24補記

清晨起床時,我太太告訴我,我們家的『蘋太郎』成熟落果了。
目前正是紐西蘭新蘋果上市的季節,所以『蘋太郎』確實是果熟落地。
我仔細瞧它的外觀,鑑別蘋果的種類,看來是Royal Gala或Bareburn,而不是期待中的NZ Rose,但這三種都是品質較好的種類。
由於果樹太幼小,才種了四個月就長蘋果,結成的果子大約僅為正常上市果子的三分之二大小。
從此之後,我們家的院子內,就有了一棵蘋果樹。

圖十、

2012年1月1日 星期日

ABC FORTH系統通告彙編(11~ )


( 一 ) ABC FORTH系統通告之十一(
2012-01-02)

敬告ABC FORTH系統的使用者:

為避免通告彙編累積得越來越大,以及利於詳細說明系統發展沿革,今後將以每十篇通告彙整成單篇的方式,保留通告於此一網頁,提供大家參考。

有很長一段時日沒有再發表ABC FORTH系統的新通告了。此期間,我集中精力發展Win32ForthV6.14版系統的中文語音輸出,直到最近,才能夠告一段落,因此,相關於ABC FORTH系統的發展,只好暫時中止。

專搞中文語音輸出,也對ABC FORTH系統很有助益,實作才能體會助益在那裡?也才能將發展中文語音輸出所帶來的好處,轉用在ABC FORTH系統上。我也等待發展能告一段落後,才來實現這些益處,發佈出更好的ABC FORTH系統。

前年2010年年底,國際網站才發佈的Win32ForthV6.14版系統,不利於中文操作,我們以自己的修正辦法解決問題,但那套辦法全以高階指令完成設計,而且無法全面顧及全系統的中文狀況,因此,雖然可用於程式的設計,卻仍然沒有解決操作載入程式時,檔案路徑還會顯示不正確中文名稱的問題。

這一次發展中文語音輸出時,刺痛了大師兄陳爽的心,因為他的名字老是被顯示成陳淇,我又特別喜歡將他傳來的程式以他的姓名作為檔案命名,操作載入程式時,出問題的部份確實礙眼。於是,他親自動手找出問題,以重新設計TR這個低階指令,修正了整個系統的問題。這份通告特將原始的TR指令,與陳爽修改後的TR指令,並列此處。

原始的設計為:

CODE TR ( addr len table -- ) \ translate a buffer
pop ecx \ length to translate
pop edi \ address of string
push edx \ save edx
add ecx, edi \ point ecx at last char
xor eax, eax \ zero eax
jmp short @@2 \ start
@@1: mov al, 0 [edi] \ get the char
mov dl, [ebx] [eax] \ translate it
mov 0 [edi], dl \ and store it back
inc edi \ point at next character
@@2: cmp edi, ecx \ past end of string?
jb short @@1 \ no, back round
xor edi, edi \ zero edi
pop edx \ restore edx
pop ebx \ adjust stack
@@9: next c;


陳爽的修正設計為:

CODE TR ( addr len table -- ) \ ebx = table
pop edi \ edi = len
pop ecx \ ecx = addr
push edx \ save edx
add edi, ecx \ edi = addr + len
xor eax, eax \ eax = 0
@@1: cmp edi, ecx \ goto @@4, if edi >= ecx
jb short @@4
mov al, [ecx] \ al = [ecx]
cmp al, # $80 \ goto @@2, if eax >= # $80
jae short @@2
mov dl, [ebx] [eax] \ dl = uppercase of al
mov [ecx], dl \ [ecx] = dl \ 原字母換成大寫
jmp short @@3 \ goto @@3
@@2: inc ecx \ ecx = ecx + 1 \ 跳過中文字
@@3: inc ecx \ ecx = ecx + 1
jmp short @@1 \ back to @@1
@@4: xor edi, edi \ edi = 0
pop edx \ restore edx
pop ebx \ tos
next c;

由於FigTaiwan網頁論壇大批資料被無故破壞,失去了保留資料的信用,將重要資料轉貼於此處,便能供作永久紀念,永不消失,也記錄了這一段發展歷史。

別處也有網頁,取用此份不勞而獲的資料轉貼,網頁邊緣卻供作不雅廣告,以收取廣告費,感覺上實在是對有價值資料極度的不敬,此處重新整理出切要部份,永久留參,排版不良,但直接能用。我的網頁內容從不拒絕複製後轉貼的操作,引用的人請給予尊重。

現今,並不是每個FORTH的愛用者,均能輕易的測試系統,以確定僅憑此項修改,便能解決中文顯示的問題。憑著長期使用這個系統的熟悉度,我則可以實際驗證,多方測試,給予肯定,未再發現新問題。

另外,大部份使用者,也不熟悉如何將修改指令永久固定於系統?我代勞後公佈了一份於FigTaiwan的網頁,允許大家自由下載使用,那一份是只適用於XP作業系統下的產品,不適用於W7環境。

同樣的,我的ABC FORTH系統也必須進行此項修改後固定下來,才能全面解決中文使用上的問題。

發展中文語音輸出工作的後期,我們又遭遇到另外一項問題,就是原始系統用於程式設計,作業所需的記憶體容量,不夠使用的問題,為此,我仍然要重設系統。

原始系統的作業規劃,係以大約527KB的系統容量,操作於1.5MB左右的作業空間,我則將此設定改成2MB左右。我將系統增加設計成ABC635系統後,只增加了25KB的記憶體耗用量,為552KB左右,可見我所增加的設計,有多精簡,為其他任何FORTH系統增建此一功能,記憶體的耗用量,就是25KB。

只要硬體實體記憶體確實夠用,重設成多大的記憶體耗用量,都不是問題,問題是大家也不太熟悉如何修改?藉此次要修正系統的機會,我就順便代勞,但只改成夠用的2MB而已。因為,通告的系統是大眾通用性的系統,改得太大了,使用時便影響作業系統執行其他系統的記憶體用量。

我的網文中,教過進行這項工作的操作原理與方法,是屬於使用FORTH四級程度的技術。我絕不重寫已經寫過的東西,也絕不重貼已經貼過的網文,錯失閱讀者,請等著買我寫的新書吧。以後,此處張貼的網文,將進行類似的處理,重要的技術網文,有些會是大眾不想閱讀的東西,可能只需刊載一天便可逕行下架,以免耗用太多的資料儲存容量限制。基本上,我的網文並不歡迎被任意轉載它處,卻無法限制,但若取用者不說明出處,給予尊重,我當然有權在此直接公佈您的大名,給您難堪。很多僅只刊載一天的文章,就不會被劫走。

除此之外,Win32ForthV6.14系統,想直接在W7作業系統中執行時,不能以從XP環境發展完成後的系統,複製到W7環境中去的方式達到目的,必須是直接在W7作業系統中自行發展出來的系統,才能複製使用。而我所設計的ABC FORTH系統,另有必須特別修正的問題,我也藉此次機會一併完成修改,現在正式公佈,但不談細節。

雖然改了不少地方,系統仍有欠缺完美之處,在我未找到修正辦法前,僅能以通告告訴大家這個問題:在W7作業系統中,凡程式中使用了NEEDS指令來載入其他前置性相關檔案的程式,以滑鼠操作載入程式時,系統會出問題,而且立即中止Win32ForthV6.14主系統的執行,讓視窗消失掉,錯誤無法追蹤。但若直接以指令FLOAD 載入程式時,則無此問題。因此,問題出在滑鼠的對應操作程式中,而非出在系統執行載入功能的程式內,以後有空我再試行解決。

此一問題係我在W7中實際使用這個系統許久之後,才發現的狀況。凡程式中恆不使用NEEDS指令者,使用滑鼠操作載入程式則全無問題。在W7作業系統中以模擬XP環境的方式使用這個系統也不會有此問題,但我不喜歡這樣使用系統,因此,我積極解決在W7中直接使用這個系統的所有問題,截至目前為止,問題只剩這一個。

NEEDS指令並不是標準指令,可以不必勉強使用它。如若強要解釋它的功能,簡而言之,它就是在純粹的FORTH環境中,用來模擬『動態連結』之用的FORTH指令,執行它時,它會從系統記錄中檢查後續檔案是否曾被載入過了?已有了就跳過而不再載入,否則就執行載入,如此而已。

FORTH系統強調『靜態連結』,它不希望發展完成的東西,還得視情況才連進系統。所以,所有與動態連結相關的設計,都有所欠缺,NEEDS就是此方面眾多問題中的另一個問題。國際網站上對此問題進行過大量的討論,暫時的結論是動態連結觀念不會永續存在,不值得為它再傷腦筋。此前曾經公告過之我所設計的程式,都不曾使用NEEDS這個指令。


     ********************************************

2013/5/17補述

關於滑鼠操作無法載入具有NEEDS <filename>程式的問題:

為了專心發展系統,我不得不停寫網文,每當系統發展告一段落後,都有許多相應測試必須進行。經過長期大量的測試後,現已能歸納出結論,在W7系統中操作的Win32Forth V6.14版系統,沒有上述的NEEDS指令問題,所有相關指令的內容也都正常,可以放心使用,這個系統是足夠健全的免費可用工具,值得肯定。

測試工作說來話長,很耗時間,最後,發現出問題處,不在Win32Forth V6.14系統本身,而在後續延伸性應用程式內。由於該部份不屬於純粹FORTH程式語言的使用範圍,而是叫用微軟作業系統後所造成的結果,因此,不宜在此深究原因,如要深究,我亦能以十足的經驗,證明錯誤根本與FORTH系統完全無關。

公開貢獻程式者不為利益而捐獻程式,不必為此事而負任何責任,我也不想公開談論是那一個程式出此問題,依然只應感謝所有公益程式的貢獻者。

發展系統形同文藝創作,不會有終止的一天,我的系統亦然,將永遠向上發展。沒有贊助經費所公開的任何研究貢獻,您使用時,除了感激之外,無權進行任何不是的批評,否則就請不要使用。

世人喜歡憑利益辦事,我自知想憑也憑不上,所以不談利益,我只將對的言論,對的作品,放在對的網上。所有此處貼出的網文,文中若有尚未解決的疑問,我會在情況許可時回顧反省,有了結論就補述說明,以示負責。

     ********************************************


此次通告,一次公佈三個修改完成的系統:

(1). 在W7環境中可以正常使用中文的普通Win32forW7.exe系統。
(2). 在XP環境中可以正常使用中文的 XPABC635Win32for.exe系統。
(3). 在W7環境中可以正常使用中文的W7ABC635Win32for.exe系統。(注意:改為不用637命名,因系統性能仍然只是635的規格)

系統容量均設定成2MB左右。
為了尊重原始系統的公益性,今後,所有的小圖示(Icon),也一律恢復使用原來的圓圖規格,而不再使用我自創的方圖圖示,系統名稱內,版本的編號,已經足以供作識別之用,不須另外進行畫蛇添足之設計。

上述系統(1)允許任何人來信索取使用,包括大陸同胞,但我並不想將程式放到任何地方,任人自由下載。

系統(2)及(3),則僅供購買過『ABC FORTH數學計算系統使用說明』者來信索取使用。來信索取時,請言明想要那一個系統?

再次強調,我所提供的系統,雖是免費,但嚴禁在網上任意傳播,一旦發現這種行為,我將立刻中斷以後更高性能系統的免費供應。

我是被迫過度消費而買64位元的電腦,只買了三個月。如果不需要為社會服務,我自己根本就不需要此物,但已經買了,就得好好使用。今後將視社會現象而調整對大家的服務,如果64位元的電腦已經普及,我便轉為單用64位元電腦發展ABC FORTH,然後放棄掉所有32位元方面的原有服務,能簡化服務項目。

每逢十月十日中華民國國慶日,就提醒了我,已經又為ABC FORTH系統多服務了一年,換句話說,服務於這個系統已經超過三年了。

現在普及型的64位元W7作業系統,依然能夠非常順利的執行出Win32Forth系統所擁有的各種功能,而且功能只增不減。因此,我仍不考慮轉換其他基底系統,作為設計ABC FORTH系統的新基礎,這樣的應用,估計還能繼續延用好幾年,由此可見,Win32Forth系統的性能,確實非凡,不用它的人,當然不懂得這些特性,它也並不在乎外行人的攻擊。

此前,我未買64位元電腦前,見過網頁上有不少隨便宣告64位元系統不能執行Win32Forth系統的論述文章,現在,可以撤文,那是外行人的說法。

只要我有實體電腦,我都能及時設計出跟得上時代的ABC FORTH數學計算系統。我買了64位元電腦之後,只花了兩個月時間,就能證明出台灣許多外行人長期誤導群眾的錯誤論斷在危害社會。因方法可貴,所以今後更不應該隨便為其他系統加設計ABC FORTH系統功能,這樣才能加速淘汰掉不健康的FORTH系統,以免它們藉此以污染社會,也因此能杜絕謠言式的論述,ABC FORTH能用來作為各種FORTH系統的品質過濾器使用。

您想不想用這個系統?悉聽尊便,我不在乎。您若不喜歡我的態度,而有骨氣到決心另謀他途,極力挑選一個殘障FORTH來發展出健康FORTH,那就再好不過。但我只為ABC FORTH系統服務,也打算永遠以其創作產物,您認為我還能為這個系統服務幾年?

今後,ABC FORTH系統通告,將僅刊載於這個網頁,使用者請自己留意,我只願將自己該做的事情,處理成完全能夠掌握在自己的手裡,不能信任的處理方法就不再使用。真金不怕火煉,我能設計永遠可以使用的ABC FORTH系統,想不想用?您請自己決定,也請不必勉強。我沒有利用它來賺錢,所以可以無慾而鋼。

我在專心設計程式時,根本沒有閒情逸緻打網文。如果每天還去網上空談,我就無法設計能夠實際執行出結果的程式,所以,這一段時日,我都忙著許多事情。我已擁有大量根據ABC FORTH設計出來的產品,卻不必要多說,只需朝著理想繼續勇往直前,寫出我想設計的數值分析程式。我能讀通的書本知識,比網頁上胡說八道的材料有意義太多了,因此,更不該浪費時間去回應網路言論,讓自己墮落在那種世俗漩渦之中。換句話說,願意與我交換FORTH技術的朋友,今後也只宜透過這個網頁與我溝通,也可以全然不必理我,這是不情之請。

以我個人的FORTH使用經驗,現今還找不到比Win32Forth系統更適合作為普及性推廣使用的其他FORTH系統,包括Swift FORTH也沒這個系統好,因為它不提供中文視窗的設計。FORTH Inc,推出該系統,並公開宣佈它是一個完全不用C式語言發展出來的系統,竟然也成為一項賣點,大概就是如此,才能被全世界許多FORTH專家接受。

因此,所有以C設計的FORTH系統,現在,大部份只剩設計者自己,或不明事理的FORTH新手,還願意隨便用一用,難有大作為。還在吹噓的系統作者,偶爾也會推出應用範例,我下載過不少這種程式仔細研究,覺得如果該作者直接就用C語言完成設計,可能比那麼勉強的使用他自己設計的殘障FORTH來表現還要好,我也看不出來,他到底想在實際會用FORTH的人面前吹噓什麼?

那些浪費掉的時間,還不如用來仔細研究:如何在C中完全不使用虛擬機(Virtual Machine),而直接使用實體機(Real Machine)的方法,實現FORTH,克服不能讓使用者直接玩透FORTH核心的問題,也許更有意義。C中可以直接使用組合語言,當然能寫得出這種程式,怕轉置性變差,不要又懶又呆,何不就像eForth那樣進行因子化研究,如何將其精簡到最簡程度?無論研究結果如何,也比用C來亂搞 (Mess up) FORTH要好。

我在網文中宣告過,今後拒絕使用C設計的FORTH系統,任何願意共同研究FORTH者,請勿與我談C式FORTH,我甚至於不喜歡教任何人利用FORTH技術到C中去,這種討論我不參與也不回應,因C為害FORTH甚烈,我又何必飼老鼠咬布袋?

用C設計產品供FORTH叫用,則非常歡迎,C只夠格做此種事情。

C有C的適用領域,產品已經很多了,但絕對不在FORTH這裡。喜歡搞C的人,應該先搞清楚這一重要觀念。這裡也絕對沒錢可賺,不是老想談賺錢者可以貪婪投機的地方。台灣過去曾經這樣做過,結果萎縮了FORTH的發展,演變到後來,只剩下想賺FORTH錢的人,自己勉強使用那種賺不了錢的FORTH,天天搞夢想,整個社會卻對這些東西避之唯恐不及。為了避免自己的錢被這種FORTH產品無辜賺走,只好去別處忙別種賺錢營生的事情,乾脆什麼FORTH都不碰了,也不再與FORTH同好接觸。這樣發展FORTH,破壞了FORTH的名聲,也破壞了FORTH的純真,從此之後,發展FORTH的優勢,久久無法挽回,太不值得,以後別再搞了。

我有很多用FORTH賺到錢的朋友,但請注意,是他們的產品賺到了錢,不是FORTH。他們直接用FORTH,但絕不高談闊論,我樂於支持他們如此而發財,他們就樂於與我交朋友,每次他們出面想幫我搞研究時,我依然是很含蓄的回應,他們所有的錢財都是辛苦打拼得來的,沒有理由一定就得出錢幫我搞研究,這是我自己這一方面應該持有的重要觀念。

台灣專用FORTH搞教育,不談賺錢的事情,則不曾中止,這才是FORTH真正的價值所在!!!

過去這三十幾年,有那一種程式語言能像FORTH這樣?它能單一發展到此,就能單一發展到永遠,C能嗎?過些時日再來檢討,就會像現今的FORTH,相對於當年流行的許多其他程式語言一樣,他們都不見了,FORTH依然健在,FORTH一向是:千山我獨行,都不必相送。

不幸世風日下,師道殘存無幾,這幾年,我體會出社會風氣促成了許多老師跟著只顧圖利,圖利圖到了自己的學生身上,無利可圖的教材不用,結果不需我來解釋,學生當然不再尊敬老師。很能導正電腦觀念的FORTH哲理,老師因覺得它無利可圖,不會教也不會用,上進的學生要求之於野才有所得,這是現今普及性的事實。

失去被尊敬資格的老師,不必來與我爭論,我只認為您是活該,我也不尊敬您,您大可繼續終身拒用FORTH教學生,繼續只顧圖利,反正早就沒人再尊敬您,不再把您當老師,現在才後悔,想教也教不成了。

推出ABC FORTH數學計算系統初期,我就找過台灣曾經教過FORTH的幾位老師,他們都告訴我這種教育界的情況,而且他們也都自覺難以扭轉情勢,我試了幾年,更能體會這些現象,不想再試了。以後,想學FORTH者,只能求諸於產、官、學界之外的第四在野集團,就是我們這一群永不消失的FORTH同好,但不必是我。

反過來說,不能尊師重道的學生,我根本不教,那怕您公開在網上甜言蜜語,我一次接觸就能看穿,想學真技術?那就慢慢來,先磨出正常的品德與好品性再說,FORTH界沒有敢出言不遜還學得到東西的學生。

國際網站上,有個渾小子,狂妄的提問:FORTH距離發展到什麼…什麼程度,還有多遠?上來回應的第一個說:大約還有幾千幾百公里。隔天上來第二個說:沒那麼遠啦,大約只剩幾十公里而已了。然後,就沒下文了。我希望任何人都別像這個渾小子一樣,太可悲了,被專家這樣子嘲笑,只因他先前經常出言不遜,後來確實該死,最後只好消聲匿跡了。

我也抗拒商售產品,販賣FORTH系統者,應該自己負責服務,不應該是我。如果硬要洽談如何為那種系統加設計ABC FORTH?那麼我們就先談價碼,我會要得很離譜,是懲罰性價格,懲罰懶到不肯規規矩矩學FORTH的人。

( 二 ) ABC FORTH系統通告之十二 (2012-03-16)

敬告ABC FORTH系統的使用者:

細心的FORTH同好讀者,應該再度讀過了我在2012-02-02網文:『Advanced BASIC in Charming FORTH』文末補述的整個完整程式了。只要您有從我這裡獲得的Win32Forth(XP/W7)635.exe系統,理所當然的能夠直接執行該程式,並獲得文中所述的任何結果。
我本無再度細述該程式的責任,想用的人應該親自操作,去體會那一套知識,台灣不想用的人居多,所以在補貼程式當時,我就沒有進行進一步的解釋,但沒料到國際來訪的觀眾較多,也出現了大方引用該文的其他網文。
其實,程式中仍然有著應該寫成ABC FORTH系統通告的材料,既然公佈了,就不該偷懶而不寫,現在就當它是為反省網文而再度補寫。我經常如此反省回顧已貼出的網文,是負責任的作法,也能增進自己對事物的認知,不是壞事,也不必在乎因此而添加了麻煩。

首先第一個要強調的程式特殊設計方式,是有關於ABC FORTH系統中變數的用法。
請大家仔細觀察程式中設計的SHIFTUP、SHIFTDOWN、MOVELEFT、MOVERIGHT四個指令,它們都共同的用到了一個被宣告為複數的Z(CENTER)變數。

●在傳統FORTH系統中,若非處於直接執行的環境,而為定義新指令的環境內,直接使用這個變數之名時,就能得此變數的值。

●若想得到這個變數的儲存位址時,只需為變數加上轉入複數運算所需的特有符號指令,也就是設計成 {[ Z(CENTER) ]} 的格式,便可得到位址。

這樣的用法,我並未在使用說明中明確的列示出來,反而在使用說明P.14、P.15、P.16三頁中,另行設計了七個功能相同的指令:ADDRESS-OF、IARRAY、IMATRIX、FARRAY、FMATRIX、ZARRAY、ZMATRIX。事實上,也可以不使用這七個指令便得到位址,您只需按照這次公佈之Mandelbrot程式中的用法,就能順利的獲得任何變數的值或變數的位址,但不包括陣列與矩陣的單個元素。上述這七個特殊指令,是專為打算在系統中直接操作,以便執行出結果而設計的。

不用額外符號時,都能得值。

想得位址時:

● 整數用 [[ …… ]]
● 實數用 {{ …… }}
● 複數用 {[ …… ]}

這三個指令的明確用法,請參考使用說明中的P.20、P21、P22。

FORTH程式語言一向被誤認為是一種符號式的語言,所以有人將其譯成『符式』之中文譯名,我一直對此譯名深感不以為然,因為FORTH根本就能使用任何全長名稱來作為指令名稱,只有幾個指令,係為了便於即時性的操作,而設計成符號,因此,FORTH完全沒有符號的意義。否則,現行許多程式語言,都應該被稱為大括號語言,因為大家都採用{ …… }來設計程式,但也與此符號沒甚麼鄭重關係。
FORTH就是FORTH,沒甚麼好翻譯的,有些程式語言的名稱,實在不宜中譯,否則硬把『C』語言翻譯成『丙等』或『丙級』語言,會氣壞了喜歡C語言的人,他們不認為他們所喜歡使用的語言與使用的習慣有那麼低等、那麼下賤。還有,若把gcc譯成了『髒兮兮』,又把『C#』進一步譯成了『丙半』(丙等的一半),豈不是更加侮辱人?就算把『C++』翻譯成了『丙上上』,也仍然還是得了個『丙』等,實在是太傷人了,不能這樣翻譯。所以,FORTH就是FORTH,在實質意義上,FORTH不是甚麼符式,『符式』只能算是比較接近的音譯名稱。
當初,為了強調值與位址的觀念,我才避用符號而另行設計明確的文字指令加入系統,現在檢討起來,純粹是多此一舉,沒有必要。習慣於看FORTH傳統程式的使用者,只須記得此處重新強調的值與位址之獲得方法,便易於直讀出程式的意義。

其次,應該向使用者發佈的另一觀念性通告,為複數在浮點堆疊上的處理方式。
系統中,複數實際上是用每兩個一組而成一對的浮點實數來表示,因此,浮點堆疊處理複數時,浮點堆疊頂部放的是虛數,而第二個單元才是實數部份,表虛數的i,不用放進浮點堆疊。請注意,這個代表虛數的i,並不是只當符號使用而完全無內容的東西,它有我所設計的執行內容,才能讓老師在黑板上的寫法,能順利的進出ABC FORTH系統,但使用者可以不必管我是如何完成設計的問題。
這個i還與傳統FORTH系統中使用的迴路指標I指令用名衝突,我讓它們同時存在系統中,不出問題,下列程式完全可以正常執行,得到正常結果:

: TEST 10 0 DO I . {[ ( 3 – 5 i ) ]} Z. LOOP ;

我很高興,國際上討論FORTH系統的複數輸出 / 輸入格式時,現在已經全面改成類似我所設計的格式了。此前,包括其他程式語言,一直使用a (+/-)i b的格式來表示複數,那是別種程式語言,不便於處理複數進出系統情況下的變通使用方法,情有可原。我從一開始設計ABC FORTH數學計算系統時,就明確的指出,FORTH能夠很容易解決複數輸出 / 輸入問題,完全可以按照教室課堂上,老師寫在黑板上的數學表示方式,設計複數表示格式,因此,三年前,領先大家設計出了最為合理的複數表示方式,現在見到普及現象了,所以高興。
如果您經常逛與數學計算相關的FORTH網頁,您可以見到最近才有人討論以FORTH求解四次方程式的程式寫法,程式必須算出複數之根。如果我記得沒錯,三年多前,我就已經公佈過解任意高次方程式的FORTH程式了,該程式也包括能解出係數就是複數的任意高次方程式之能力。我仔細讀過該網文內詳列之陳之藩博士的科技著作,書中介紹了純粹為華人所自創,求解高次方程式的數值分析技術,相當高明,我讀通之後,才能設計得出該大型程式。
一直到昨天,國際最熱門FORTH網路論壇上,FORTH專家才群起討論S>F與F>S指令的標準化問題。我所設計的系統中,三年前就將問題設計成埋入系統的方式,提供大家使用了,因此,大家可能體會不出這種作法的先進意義。國際友人也常來逛我的網頁,從我公開的程式中,他們能見到我在系統中處理這種問題的方法,事實上就是比較先進。大師兄陳爽最近在設計他的雲端FORTH系統時,也讓系統能接受各種格式的輸入數字了,裡面就得用到這類指令,把它埋進系統。
能擁有超前世界技術水準幾年的系統,絕非普通系統,國人同胞卻不欣賞,我並不在意,所以我就撤掉該篇相關網文了。此處重談這些現象,只是基於應永遠負起說明系統性能的責任而談,不作它想。
您想不想用我所設計的系統?悉聽尊便,萬勿勉強。因為,這個系統可能是一個全世界只有我自己想用的系統。最近,我仔細想過一些相關現象:

我能見到的十個人當中,大約只有一個人要用電腦。
我能見到要用電腦的十個人當中,大約只有一個人要寫程式。
我能見到要寫程式的十個人當中,大約只有一個人要用FORTH。
我能見到要用FORTH的十個人當中,大約只有一個人要寫數學計算程式。
最後,全世界豈不是僅只有我一個人要這樣子寫數學計算程式?
難怪,我跟大家談這個系統,不太有人理會。
此後,我用自己設計的系統解自己的問題就夠了,何須自找麻煩白費心機?

為了信守已售出使用說明的責任,則應對這些使用者,繼續永遠的服務。我也開始慎重考慮,此後應改採高價售出系統使用說明的方式,來減輕負擔,心意不誠者就不會隨便購買。

第三個該向讀者說明的程式設計方法,不屬於ABC FORTH數學計算系統的範疇,但面對使用FORTH設計程式已經全面弱化的今天,我還是願意介紹這種簡單程式。
在Mandelbrot程式中,最後一個可以直接執行的MAIN指令內,出現了八個怪異的數字,它們代表鍵盤右邊的幾個鍵碼,程式中雖然附加了背斜線後方的文字標示說明,新進的FORTH使用者,可能仍不熟悉這些碼的獲得來源,我把需用程式放在這裡,全用標準指令設計,沒有難懂花樣。深一點的難懂程式,您可以留著以後才搞懂,這一個程式,現在就應該搞懂,而且,我不宜解釋程式內容,您應該自己實測後了解,它在設計互動式(Interactive)程式時非常、經常有用,最近,我常用,這個程式本身就是一個標準的互動式程式。

: KEYCODE ( -- )
BEGIN
KEY CR .” Key code of the “ DUP EMIT .” is “ DUP .
27 =
UNTIL ;

執行KEYCODE指令之後,要壓Esc鍵,才能跳出循環迴路。希望您了解我提供這個簡單程式的用心。

(三) ABC FORTH系統通告十三 (2015-1-1)

為易於貼文操作,不再對系統新增功能進行中文解釋,有興趣就請自行觀碼後體會。

本展示程式曾於2014年年底,在國際論壇comp.lang.forth上故意公開展示過。惡劣挑釁讀者挑釁的結果,便是更加加強本系統作者永不公開系統設計細部內容的決心,以示對網上惡徒永久的懲罰。本文作者的微薄技術,恆只教良人,不教惡人,甚至於連看都不想讓惡徒看,惡徒無恥硬要看,就請丟著臉看。

讀者必須明白,微軟公司所有BASIC系統程式的源程式也永久恆不公開的。我們原本良好的FORTH社群環境,很值得本文作者公開ABC FORTH系統的設計技術,讓其永久留傳下去。有惡徒敢公開搗亂,那麼,大家就必須接受惡徒所賜給大家的懲罰,這種網上惡徒問題無法合理解決之前,本文作者便不再作其他正面打算。

您看了這樣的宣告,高興也好,不高興也罷,有本事,就請自己設計更好的系統,任何有心向上、品德優良的讀者,都絕對可以經由仔細閱讀本文作者在國際論壇上以英文公開斥責惡徒,進一步明示設計依據的細部論述,自行發展出來。

若您品德夠好,還有問題,可以與我交流學習,沒品,就請別來討挨罵。


一個極度缺乏家庭教養自稱為empty-buffers的惡徒,跟台獨、民進黨、及來自匪區的流氓行徑完全一個樣子,他對FORTH毫無貢獻也就罷了,卻不停的在comp.lang.forth國際論壇上胡說八道、耍賴、搗亂到底,在純英語的環境裡,以比我更彆腳的英文,丟盡華人的臉,有只講英文的人看不順眼而出面罵他,情況令人噁心透頂,他想讓全球華人一起因他而受害。

依我個人見解,這名惡徒不是一個人(雙關語),是有目的而來,與同一論壇上假裝使用FORTH卻只有低級程度的另幾個同類惡徒,一起形成有組織的破壞小組,執行任務,為時已久。騰訊禁詞內,仍高列FORTH、符式、第四為禁詞。Google近幾天在大陸營運受阻,自由世界的gmail信箱在整個大陸被禁用。這些事情,就足以告訴大家共匪有多可惡,生活在共匪壓迫環境下的人民有多可悲。以我自己的破英文能力,就足夠用來看出那幾個使用更彆腳英文的惡徒來自那裡?他們還沒辦法學會台灣人特有的慣用英文,但我們貼過,他們就會學著亂用,因此,很容易識別他們的出處。更何況大陸良民早就不能使用Google網路公開參與論壇了,這批惡徒卻有著共匪才能擁有的明顯特質,有特權使用,那麼,誰不知道誰才能用?而且,很明顯的可以看得出來,惡徒是一群被自由世界羞辱、謔稱為『五毛』的傢伙,所形成的國際網頁攻擊組織,他們有特定目標,24小時守候,當班的英文太差,也得使用爛英文攻擊,稍後胡說八道、不知所云、骯髒齷齪的長篇大論,則是其他五毛貼的,整個凸顯出來的特徵,則是永遠貼不出像樣的FORTH程式,或像樣的FORTH相關訊息,反正他們的目的,主要就只是以低劣手段進行破壞。

我有留下網頁記錄、下載歸檔留參的習慣,這些資料能夠永遠提醒自己,牢記共產匪徒的惡行,共匪的惡行惡狀本質是永遠不會改變的!

我也有能力以英文通知國際友人注意這批惡徒,沒必要就全不回應,有必要就採取行動檢舉相關單位,執法管制惡徒,限制他們出入自由世界,限制他們獲得有用資料。這幾個傢伙曾經網上咆哮,無法獲得我所公開推薦的有用論文,那就是實例。講英文的朋友告訴我,他們不感到驚奇,也不會不懂這些事情,也接受了我的建議:不回應。

我曾大力推薦過comp.lang.forth這個有用的國際論壇,原本資源豐富可貴,現已形成是他們長期亂貼垃圾的地方,有用訊息幾近於零,大概也係因為我曾公開推薦而被共匪鎖定成為破壞目標,去年(2014)一整年,得不到任何有用訊息。我這次的故意網貼,主要目的也僅只是想在世人可以眼見共匪惡行期間,故意在那裡留下記錄,凸顯共匪的可惡,造成網上歷史事實,已達目的便可。自己辛苦奮鬥出來的好用系統,應該開花,公開宣告它的存在,明示眾人就是開花。至於能不能或該不該結果?那就看世人自己的反應,能結、該結才結其果,世人可以自討結果。我嘛,完全可以自享成果,不受任何影響,這原本就是我自己的東西,這樣做,沒什麼稀奇。

至於另篇網貼的內容嘛,沒什麼新奇處,與這篇差不多,另篇只是在大搞一般FORTH系統根本難搞的矩陣運算表示式而已,有空時,我再將實際程式加補貼於此處。願意仔細看的人,必可發現純用傳統FORTH設計數學計算程式時,絕對無法實現的有用、可貴技術。

我對網上經常喜歡自以為是的發言沒有興趣,因此懶得與講不聽的人亂爭,三次警告對方,若對方仍是依然故我,那就只好任由他去,不予理會。

在國際論壇上,我採取不言則已、一鳴驚人的方式表示我的個人意見,我停止貼文後的後續結果可以明證。都是用英文寫的,看得懂就請去看,看不懂也無所謂。

我拋出簡單的幾個字,就絕對能讓那些經常網上自命不凡的殘障FORTH系統推出人忙個老半天,他們永遠空談也得不到任何結果。君不見,我勉為其難的提供一個數學運算符號的優先度專用指令PRECEDENCE,就能讓那些人知難而退,或繼續鐵齒空談,忙得團團轉,還想當革命領袖、創造歷史。

我透過書信,要求英國方面,提供將總執譯程式中的NUMBER向量化,以利今後在FORTH系統內,發展數學計算應用的評估版系統,隔兩天,就有長篇大論形同標準規格的公文式訊息,貼上網,讓大家來論,來談。

我的個人能力沒什麼,長期可貴的經驗,則絕對對某些方面的發展,具有重大的影響。我用英文說過了,這是姜太公釣魚,願者上鈎,大家完全可以不必理會我的意見,繼續滯留在當前FORTH搞不下去的困境。如果早已公然貼出之大量純FORTH設計出來的數學計算程式是絕對真理,那麼,真理的影響早該形成了,至今完全沒有,為什麼?需要另想辦法了,所以才有ABC FORTH數學計算系統的建議。

數學計算絕對是電腦的主要功能,拒搞,就別再拿電腦當電腦,平板行動裝置就是以這種態勢取代電腦,如此而已。創作文章,數學計算,資料處理…等事情,永遠需要靜下心來好好使用電腦,不是只靠輕鬆瀏覽一下網路,就絕對能夠圓滿解決問題的事情,已經幾十年了,沒有改變。將來如何?將來再說。

我敢以自己微薄的能力,面對全世界自認為是現行頂尖領頭羊之幾位推出FORTH系統的名人公然論論談談,憑藉的是中國人身體力行、堅毅不拔的實力,也沒什麼。有人老貼64位元的數字,我獨力就能完成128位元的系統,這也沒什麼。設計時,用的全是童年時期一天能做50題『武明算術』練習題所培養出來的本領。全德國非得拿『進位』處理訂定成標準規格,想要冠蓋統領全世界時,我單獨一個中國人,就能展示不用『進位』照樣完成任務的倍量處理系統。再倍量,依然照辦,讓人沒得比。

多年前,我張貼了112位數精確度全程演算程式的系統時,網貼遭到攻擊,參訪者只能看到HTML式的網頁亂碼,我自己只用中文顯示檢查,看不出該網頁有任何問題,這次,論壇上被高手連續要求三次,看不到真碼,只好在comp.lang.forth上硬行重貼,然後抽空回頭修補自己的網頁,這才澈底明白了網頁早就被長期破壞掉了的問題。請注意!那是幾年前,整個系統就已經能以至少112位數的精確度,把數學計算程式從頭算到底了,不是只算一次,也不是這幾天才能如此,我相信,任何人早就該明白,再去論壇強貼64位元,20幾位數精確度的浮點算數,當販賣系統的廣告,是個完全沒有意義、丑表拙技的愛現展示。我的系統,恆只採用6位數作為現行顯示,需要跟任何人的20幾位數比高下嗎?得了,不必,搞清電腦執行數學計算的主要宗旨再說吧。

網上敢公然向我下『聖旨』式指令的鼠輩,我是不會生氣的,客氣回答您,『聖旨』傳不到此,『真旨』run給您看。您若知恥,就能近乎勇,知道吧?我若絕口不提任何技術術語時,您大概才能體會,無『真旨』可看後的痛苦。

這些是這幾天我在國際論壇網站上,論談一陣子後的一些趣事,隨便寫寫,也隨便您看或不看,留個紀念就夠了。

有時,我常想,FORTH這麼難搞推廣,大家也不用搞了,有現成還能跟的,就跟,無能跟的,就算了,忘掉它吧。只拿FORTH搞個1010亮亮滅滅的事情,別種工具也很容易實現的。

許多國際知名網站,我都曾看過十幾年絕不講話,如果該網站訊息的貼出者,恆有素質惡劣,劣性不改的惡徒混雜其間,我當然也能繼續再看它十幾年甚至於幾十年絕不講話。結果,吃虧的會是誰?絕對不會是我。這就形同敵我作戰時,敵明我暗,敵人的一切我都看得清清楚楚,我的一切你完全看不清楚,勝負當然就很容易分曉了。已經安度一生,可以不求名利的享受晚年,是不會在乎聲望與利益之有無的,所以根本不會想要利用知名網站來壯大自己。老來,只講該講的話,只做該做的事,聲名與我何有哉?利益與我何有哉?享受與我,則必須要有哉!

我早已決定並宣佈過:ABC FORTH不進匪區,當然是共匪的眼中釘,幾年過了,共匪恆得不到,他們必然氣死了,國際論壇上才會有這些瘋子反應。

看到這種態勢,大家更能明白,幾年前,我的決定可貴在那裡了,記住!共匪流氓匪徒的本質,是永遠不會改變的。

跟共匪靠攏的人,我一律把你當共匪看,台灣自己的FORTH網頁,這一年來也已有相同的記錄,早已成為單一個惡徒的個人網頁了,沒有任何值得閱讀的訊息,同時也在國際上丟臉,你們是該深切檢討,難道已被惡徒把持了?真可笑!

Quadratic Equation

Why I show you such a program for the quadratic equation?

(1)   In a Real number calculation environment, if the argument of SQRT (SQuare RooT function) is a negative number, the answer will be 0. In general, SQRT can not give you the answer of two image numbers for a negative number argument automatically.  
(2)   I would like to show you the ability of file I/O (input and output) in ABC FORTH system. We are familiar with quadratic equation. This program then can simplify my intention.
(3)   General mathematical calculation system has no complex number function, ABC FORTH system has. This program deal with real number coefficients equation first, but do the checking by complex number function later. Such an arrangement is on purposed.
(4) Input data file can be built by any kinds of simple plain text editor even by EXCEL system. Looking inside to this demonstration, integers, double numbers and floating point numbers are all mixed together. ABC FORTH is able to accept all of them directly, with FORTH style comments after \ as well.

Win32Forth is the mother system of ABC FORTH temporarily. Sorry, it is hard to me to answer any question from you owing to my poor English. You are welcome to discuss this demo code in English. I am reading here everyday.



 (30)QuadraticEq.f 
ABC FORTH file I/O demo code 
Author   : Ching-Tang Tseng, Hamilton NZ 
Date      : 6 Aug 2012 
Contact : ilikeforth@gmail.com 
Website : http://forthfortnight.blogspot.com 

2 Integers I N 
20 3 matrix coef 
\ BRA(i) is a primitive BASIC style Real Array in ABC FORTH 

: ReadCoef ( -- ) 
BASIC 
10 run S" (30-1)QuadraticEqCoeff.f" Get-File 
20 run GetOneLineData 
30 let N = INT ( BRA ( 1 ) )         
40 for I = 1 to N 
50 run GetOneLineData 
60 let { coef ( I 1 ) = BRA ( 2 ) } 
70 let { coef ( I 2 ) = BRA ( 3 ) } 
80 let { coef ( I 3 ) = BRA ( 4 ) } 
90 next I 
100 end 


9 Reals a b c x f(x) x1 x2 d dsq 

: RealRootCheck ( -- ) 
BASIC 
10 let { f(x) = a * x * x + b * x + c } 
20 end 


5 COMPLEXS za zb zc zx f(zx) 

: ComplexRootCheck ( -- ) 
BASIC 
10 let [ za = r>zr ( a ) + r>zi ( 0 ) ] 
:: [ zb = r>zr ( b ) + r>zi ( 0 ) ] 
:: [ zc = r>zr ( c ) + r>zi ( 0 ) ] 
20 let [ f(zx) = za * zx * zx + zb * zx + zc ] 
30 end 


: Once ( -- ) 
BASIC 
10 if { a = 0 AND b = 0 } then 400 
20 if { a = 0 } then 300 
30 let { d = b * b - ( 4 * a * c ) } 
40 if { d >= 0 } then 100 
50 goto 200 
100 let { dsq = SQRT ( d ) } 
:: { x1 = ( NEGATE b + dsq ) / ( 2 * a ) } 
:: { x2 = ( NEGATE b - dsq ) / ( 2 * a ) } 
110 let { x = x1 } 
120 run RealRootCheck 
130 print { " Root x1:" , x1 ; " ==> f(x1) = " , f(x) } 
140 let { x = x2 } 
150 run RealRootCheck 
160 print { " Root x2:" , x2 ; " ==> f(x2) = " , f(x) } 
170 goto 900 
200 let { d = ABS ( ( SQRT ( ( 4 * a * c ) - b * b ) ) / ( 2 * a ) ) } 
210 let { x1 = negate b / ( 2 * a ) } 
220 let [ zx = r>zr ( x1 ) + r>zi ( d ) ] 
230 run ComplexRootCheck 
240 print [ " Root x1 = " ; zx ; " ==> f(x1) = " ; f(zx) ] 
245 print { " ABS(f(x1)) = " ; ZABS ( f(zx) ) } 
250 let [ zx = r>zr ( x1 ) - r>zi ( d ) ] 
260 run ComplexRootCheck 
270 print [ " Root x2 = " ; zx ; " ==> f(x2) = " ; f(zx) ] 
275 print { " ABS(f(x2)) = " ; ZABS ( f(zx) ) } 
280 goto 900 
300 let { x1 = NEGATE c / b } 
310 let { f(x) = b * x1 + c } 
320 print { " This equation has only one root x = " ; x1 ; " ==> f(x) = " ; f(x) } 
330 goto 900 
400 print " This is not an appropriate quadratic equation!" 
900 run CR 
910 end 


: test ( -- ) 
BASIC 
10 let { a = 8 } :: { b = -33.33 } :: { c = 9.876e2 } 
20 print { " Equation:( " ; a ; " )*x^2 + ( " ; b ; " )*x + ( " ; c ; " ) = 0" } 
30 run ONCE 
40 end 

: hi ( -- ) 
BASIC 
10 print " Typical real coefficient quadratic equation: ax^2 + bx + c = 0 " CR 
20 print " Please enter its three coefficients: a b c " CR 
30 inputR a , b , c 
40 run ONCE 
50 end 


: main ( -- ) 
PAGE 
BASIC 
10 run ReadCoef 
20 run S" (30-2)OutputResult.f" new-file 
30 run >file 
40 for I = 1 to N 
50 let { a = COEF ( I 1 ) } 
:: { b = COEF ( I 2 ) } 
:: { c = COEF ( I 3 ) } 
60 print " ( " ; I ; " )" 
; { " Equation:( " ; a ; " )*x^2 + ( " ; b ; " )*x + ( " ; c ; " ) = 0" } 
70 run Once 
80 next I 
90 run file> 
100 run S" (30-2)OutputResult.f" save-file 
110 run filetype 
120 end 


cr cr 
.( Usage: ) cr 
.( 1. test : for fixed data set using. ) cr 
.( 2. hi : for interactive input data using. ) cr 
.( 3. main : for file I/O data sets using. ) cr 

\S 

Part 1 : Contents of (30-1)QuadraticEqCoeff.f 

10                           \ this line means total are 10 sets given data 
1 3 2 1                    \ this line means set (1) 3x^2+2x+1=0 
2 9.85 3.23 18        \ this line means set (2) 9.85x^2+3.23x+18=0 
3 1 0 -1 
4 33 57.62e+12 900e+14 
5 0 0 9 
6 0 9 0 
7 40 0 0 
8 0 12 -400 
9 9 -9 9 
10 -1 2 -3 

Part 2 : Contents of (30-2)OutputResult.f 

( 1 )Equation:( 3.00000 )*x^2 + ( 2.00000 )*x + ( 1.00000 ) = 0 
Root x1 = -.333333 + .471405 i ==> f(x1) = 0.00000E0 + 1.11022E-16 i 
ABS(f(x1)) = 1.11022E-16 
Root x2 = -.333333 - .471405 i ==> f(x2) = -4.44089E-16 + 0.00000E0 i 
ABS(f(x2)) = 4.44089E-16 
( 2 )Equation:( 9.85000 )*x^2 + ( 3.23000 )*x + ( 18.0000 ) = 0 
Root x1 = -.163959 + 1.34184 i ==> f(x1) = 3.55271E-15 + 0.00000E0 i 
ABS(f(x1)) = 3.55271E-15 
Root x2 = -.163959 - 1.34184 i ==> f(x2) = 3.55271E-15 + 0.00000E0 i 
ABS(f(x2)) = 3.55271E-15 
( 3 )Equation:( 1.00000 )*x^2 + ( 0.00000E0 )*x + ( -1.00000 ) = 0 
Root x1: 1.00000 ==> f(x1) = 0.00000E0 
Root x2: -1.00000 ==> f(x2) = 0.00000E0 
( 4 )Equation:( 33.0000 )*x^2 + ( 5.76200E13 )*x + ( 9.00000E16 ) = 0 
Root x1: -1561.96 ==> f(x1) = 1.83714E9 
Root x2: -1.74606E12 ==> f(x2) = -8.89553E9 
( 5 )Equation:( 0.00000E0 )*x^2 + ( 0.00000E0 )*x + ( 9.00000 ) = 0 
This is not an appropriate quadratic equation! 
( 6 )Equation:( 0.00000E0 )*x^2 + ( 9.00000 )*x + ( 0.00000E0 ) = 0 
This equation has only one root x = -0.00000E0 ==> f(x) = 0.00000E0 
( 7 )Equation:( 40.0000 )*x^2 + ( 0.00000E0 )*x + ( 0.00000E0 ) = 0 
Root x1: 0.00000E0 ==> f(x1) = 0.00000E0 
Root x2: -0.00000E0 ==> f(x2) = 0.00000E0 
( 8 )Equation:( 0.00000E0 )*x^2 + ( 12.0000 )*x + ( -400.000 ) = 0 
This equation has only one root x = 33.3333 ==> f(x) = 0.00000E0 
( 9 )Equation:( 9.00000 )*x^2 + ( -9.00000 )*x + ( 9.00000 ) = 0 
Root x1 = .500000 + .866025 i ==> f(x1) = -1.77636E-15 + 0.00000E0 i 
ABS(f(x1)) = 1.77636E-15 
Root x2 = .500000 - .866025 i ==> f(x2) = -1.77636E-15 + 0.00000E0 i 
ABS(f(x2)) = 1.77636E-15 
( 10 )Equation:( -1.00000 )*x^2 + ( 2.00000 )*x + ( -3.00000 ) = 0 
Root x1 = 1.00000 + 1.41421 i ==> f(x1) = 0.00000E0 + 4.44089E-16 i 
ABS(f(x1)) = 4.44089E-16 
Root x2 = 1.00000 - 1.41421 i ==> f(x2) = 0.00000E0 + 0.00000E0 i 
ABS(f(x2)) = 0.00000E0 
  
Part 3 : Output on the screen 
ok 
test 
Equation:( 8.00000 )*x^2 + ( -33.3300 )*x + ( 987.600 ) = 0 
Root x1 = 2.08312 + 10.9138 i ==> f(x1) = 0.00000E0 + 0.00000E0 i 
ABS(f(x1)) = 0.00000E0 
Root x2 = 2.08312 - 10.9138 i ==> f(x2) = -1.13687E-13 - 5.68434E-14 i 
ABS(f(x2)) = 1.27106E-13 
ok 
hi 
Typical real coefficient quadratic equation: ax^2 + bx + c = 0 
Please enter its three coefficients: a b c 
? 1 1.23e2 139.55 
Root x1: -1.14522 ==> f(x1) = 0.00000E0 
Root x2: -121.855 ==> f(x2) = 7.38964E-13 
ok 
main 
Fileid is: 428 
126 Bytes are read into the Fadr RAM buffer! 
fileid is: 428 
0 Bytes are read into the Fadr RAM buffer! 
fileid is: 428 
2011 Bytes had been written out to a file! 
( 1 )Equation:( 3.00000 )*x^2 + ( 2.00000 )*x + ( 1.00000 ) = 0 
Root x1 = -.333333 + .471405 i ==> f(x1) = 0.00000E0 + 1.11022E-16 i 
ABS(f(x1)) = 1.11022E-16 
Root x2 = -.333333 - .471405 i ==> f(x2) = -4.44089E-16 + 0.00000E0 i 
ABS(f(x2)) = 4.44089E-16 
( 2 )Equation:( 9.85000 )*x^2 + ( 3.23000 )*x + ( 18.0000 ) = 0 
Root x1 = -.163959 + 1.34184 i ==> f(x1) = 3.55271E-15 + 0.00000E0 i 
ABS(f(x1)) = 3.55271E-15 
Root x2 = -.163959 - 1.34184 i ==> f(x2) = 3.55271E-15 + 0.00000E0 i 
ABS(f(x2)) = 3.55271E-15 
( 3 )Equation:( 1.00000 )*x^2 + ( 0.00000E0 )*x + ( -1.00000 ) = 0 
Root x1: 1.00000 ==> f(x1) = 0.00000E0 
Root x2: -1.00000 ==> f(x2) = 0.00000E0 
( 4 )Equation:( 33.0000 )*x^2 + ( 5.76200E13 )*x + ( 9.00000E16 ) = 0 
Root x1: -1561.96 ==> f(x1) = 1.83714E9 
Root x2: -1.74606E12 ==> f(x2) = -8.89553E9 
( 5 )Equation:( 0.00000E0 )*x^2 + ( 0.00000E0 )*x + ( 9.00000 ) = 0 
This is not an appropriate quadratic equation! 
( 6 )Equation:( 0.00000E0 )*x^2 + ( 9.00000 )*x + ( 0.00000E0 ) = 0 
This equation has only one root x = -0.00000E0 ==> f(x) = 0.00000E0 
( 7 )Equation:( 40.0000 )*x^2 + ( 0.00000E0 )*x + ( 0.00000E0 ) = 0 
Root x1: 0.00000E0 ==> f(x1) = 0.00000E0 
Root x2: -0.00000E0 ==> f(x2) = 0.00000E0 
( 8 )Equation:( 0.00000E0 )*x^2 + ( 12.0000 )*x + ( -400.000 ) = 0 
This equation has only one root x = 33.3333 ==> f(x) = 0.00000E0 
( 9 )Equation:( 9.00000 )*x^2 + ( -9.00000 )*x + ( 9.00000 ) = 0 
Root x1 = .500000 + .866025 i ==> f(x1) = -1.77636E-15 + 0.00000E0 i 
ABS(f(x1)) = 1.77636E-15 
Root x2 = .500000 - .866025 i ==> f(x2) = -1.77636E-15 + 0.00000E0 i 
ABS(f(x2)) = 1.77636E-15 
( 10 )Equation:( -1.00000 )*x^2 + ( 2.00000 )*x + ( -3.00000 ) = 0 
Root x1 = 1.00000 + 1.41421 i ==> f(x1) = 0.00000E0 + 4.44089E-16 i 
ABS(f(x1)) = 4.44089E-16 
Root x2 = 1.00000 - 1.41421 i ==> f(x2) = 0.00000E0 + 0.00000E0 i 
ABS(f(x2)) = 0.00000E0 

  ok 

懶得整理了,就全貼當紀念吧。


Is old code out of phase?

Am I too old, posted codes is useless, meaningless, disturbed you too much?
If yes, sorry very much, it is alright, I can back off, be quiet, standing aside, just seeing you young guy. After this posting, let’s take a rest away from BASIC.

How are you Hugh? Wish you are all right. You are good. See you some other day.

I have many times experiences to get some old code here. Some of them are even more than 20 years old (1994). I have done a one time searching, sorting out 9 useful square root FORTH programs. Where is another comp.lang.forth? It is hard to find.

This time, you can say that this code is old enough more than 30 years (1980). But he is in phase still. I still use it on Win32Forth under W7 OS. How about the code of 1968? The same situation, I have, and keep it going running right now, and can let it keep going running after another 30 years. FORTH made it, makes it, and will make it forever. This code is the proving. I hope I can see it again after 30 years. So, I am only just posting it here. Have interesting? Please look back to Charles H. Moore, “Programming a BASIC Compiler in FORTH”, FORML 1981, p.513. 8 blocks program inside.

If you think that FORTH is really hard to use, and you are still need some help to solve some mathematics problems? How about you pay let me do? Do you have any valuable FORTRAN code would like to extend his life forever? You pay I do. No matter how big it is? You pay I do. The reference book of the following program was got from OP (Opportunity) shop in New Zealand. Cost me one dollar only.

\ ABC FORTH demo code: Inverse Matrix
\ Author: Ching-Tang Tseng, Hamilton, New Zealand
\ Date: 2009-06-14 (renewed for c.l.f. posting on 2014-12-19)
\ Contact: ilikeforth@gmail.com

\ Reference: F. R. Rukdeschel, "BASIC Scientific Subroutines Vol.1”,
\ BYTE/McGRAW-HILL, 1980, p.95, Matrix inversion subroutine (MATINV)
\ Gauss-Jordan Elimination
\ Matrix A is input. Matrix C is output

20 VALUE D      \ unique setting in this program for maximum matrix Dimension

D D MATRIX U
D D MATRIX V
D D MATRIX W

D D MATRIX A
D D 2 * MATRIX B
D D MATRIX C

7 INTEGERS I J K N I+N J+N M
1 REALS B1

: InputData ( -- )
  [[ N = 5 ]]
  {{ A ( 1 1 ) = 1 }} {{ A ( 1 2 ) = 3 }} {{ A ( 1 3 ) = 2 }} {{ A ( 1 4 ) = 6 }} {{ A ( 1 5 ) = 4 }}
  {{ A ( 2 1 ) = 3 }} {{ A ( 2 2 ) = 5 }} {{ A ( 2 3 ) = 4 }} {{ A ( 2 4 ) = 2 }} {{ A ( 2 5 ) = 6 }}
  {{ A ( 3 1 ) = 3 }} {{ A ( 3 2 ) = 8 }} {{ A ( 3 3 ) = 6 }} {{ A ( 3 4 ) = 7 }} {{ A ( 3 5 ) = 5 }}
  {{ A ( 4 1 ) = 2 }} {{ A ( 4 2 ) = 5 }} {{ A ( 4 3 ) = 3 }} {{ A ( 4 4 ) = 4 }} {{ A ( 4 5 ) = 4 }}
  {{ A ( 5 1 ) = 7 }} {{ A ( 5 2 ) = 6 }} {{ A ( 5 3 ) = 8 }} {{ A ( 5 4 ) = 7 }} {{ A ( 5 5 ) = 6 }}
;

: MatrixInverse ( -- )
BASIC
10 FOR I = 1 TO N
20 FOR J = 1 TO N
30 LET J+N = J + N
40 LET { B ( I J+N ) = 0 }
50 LET { B ( I J ) = A ( I J ) }
60 NEXT J
70 LET I+N = I + N
80 LET { B ( I I+N ) = 1 }
90 NEXT I

\ Perform row oriented operations to convert the left hand side of B
\ to the identity matrix. The inverse of A will then be on the right.

100 FOR K = 1 TO N

110 IF K = N THEN 240
120 LET M = K

\ Find maximum element
130 FOR I = K + 1 TO N
140 IF { ABS ( B ( I K ) ) > ABS ( B ( M K ) ) } THEN 160
150 GOTO 170
160 LET M = I
170 NEXT I

180 IF M = K THEN 240
190 FOR J = K TO 2 * N
200 LET { B1 =  B ( K J ) }
210 LET { B ( K J ) = B ( M J ) }
220 LET { B ( M J ) = B1 }
230 NEXT J

\ Divide row K
240 FOR J = K + 1 TO 2 * N
250 LET { B ( K J ) = B ( K J ) / B ( K K ) }
260 NEXT J

270 IF K = 1 THEN 340

280 FOR I = 1 TO K - 1
290 FOR J = K + 1 TO 2 * N
300 LET { B ( I J ) = B ( I J ) - B ( I K ) * B ( K J ) }
310 NEXT J
320 NEXT I

\ Beware of this branch will be out of K loop.
330 IF K = N THEN 350 
340 GOTO 370
350 RUN 2drop
360 GOTO 430

370 FOR I = K + 1 TO N
380 FOR J = K + 1 TO 2 * N
390 LET { B ( I J ) = B ( I J ) - B ( I K ) * B ( K J ) }
400 NEXT J
410 NEXT I

420 NEXT K

\ Retrieve inverse from the right side of B
430 FOR I = 1 TO N
440 FOR J = 1 TO N
450 LET J+N = J + N
460 LET { B ( I J ) = B ( I J+N ) }
470 NEXT J
480 NEXT I

\ B is not a square matrix so transfer to square matrix C
490 FOR I = 1 TO N
500 FOR J = 1 TO N
510 LET { C ( I J ) = B ( I J ) }
520 NEXT J
530 NEXT I

490 END
;

: PrintMatrixW ( -- )
BASIC
10 RUN CR
20 FOR I = 1 TO N
30 FOR J = 1 TO N
40 LET { B1 = W ( I J ) } \ Based on W matrix
40 RUN B1 (F,)        \ Right justified printing
50 NEXT J
60 RUN CR
70 NEXT I
80 END
;

: TotalAmount ( -- )
  D 1+ DUP * 3 CELLS * ;
: MoveAtoW ( -- )
  address-of A 0 0 FMatrix
  address-of W 0 0 FMatrix
  TotalAmount CMOVE ;
: MoveCtoW ( -- )
  address-of C 0 0 FMatrix
  address-of W 0 0 FMatrix
  TotalAmount CMOVE ;
: MoveAtoU ( -- )
  address-of A 0 0 FMatrix
  address-of U 0 0 FMatrix
  TotalAmount CMOVE ;
: MoveCtoV ( -- )
  address-of C 0 0 FMatrix
  address-of V 0 0 FMatrix
  TotalAmount CMOVE ;

: Matrix* ( -- )
BASIC
\ Square Matrix Multiplication
\ W = U x V
10 FOR I = 1 TO N
20 FOR J = 1 TO N
30 LET { W ( I J ) = 0 }
40 FOR K = 1 TO N
50 LET { W ( I J ) = W ( I J ) + U ( I K ) * V ( K J ) }
60 NEXT K
70 NEXT J
80 NEXT I
90 END
;

: Checking ( -- )
BASIC
10 RUN MoveAtoU
20 RUN MoveCtoV
30 RUN Matrix*
40 RUN PrintMatrixW
50 END
;

: Once ( -- )
BASIC
10 PRINT " Matrix A = "
20 RUN MoveAtoW
30 RUN PrintMatrixW
40 RUN MatrixInverse
50 PRINT " Inverse of A = "
60 RUN MoveCtoW
70 RUN PrintMatrixW
80 PRINT " Matrix A times inverse of A = Identity Matrix "
90 RUN Checking
100 END
;

: test ( -- )
BASIC
10 RUN InputData
20 RUN Once
30 END
;

: hi ( -- )
BASIC
10 PRINT " Input dimension of Matrix to be inverted "
20 INPUTI N
30 FOR I = 1 TO N
40 PRINT " Input row " ; I
50 FOR J = 1 TO N
60 RUN CR
70 INPUTR B1
80 LET { A ( I J ) = B1 }
90 NEXT J
100 NEXT I
110 RUN Once
120 END
;

: ReadData ( -- )
BASIC
10 RUN S" MatInvData01.f" Get-File
20 RUN GetOneLineData
30 LET N = INT ( BRA ( 1 ) )
40 FOR I = 1 TO N
50 RUN GetOneLineData
60 FOR J = 1 TO N
70 LET { A ( I J ) = BRA ( J ) }
80 NEXT J
90 NEXT I
100 END
;

: main ( -- )
BASIC
10 RUN ReadData
20 RUN Once
30 END
;

page
.( Usage: ) cr
.( 1. test  : for fixed input data ) cr
.( 2. hi   : for interactive input data ) cr
.( 3. main : for data input from file ) cr

\S
Usage:
1. test  : for fixed input data
2. hi   : for interactive input data
 ok
test
Matrix A =
1.00000   3.00000   2.00000   6.00000   4.00000
3.00000   5.00000   4.00000   2.00000   6.00000
3.00000   8.00000   6.00000   7.00000   5.00000
2.00000   5.00000   3.00000   4.00000   4.00000
7.00000   6.00000   8.00000   7.00000   6.00000

Inverse of A =
-.262431  -.367403  -.602210  1.17680   .259669
-.279006  -.190608  -.071823  .745856   -.060773
.135359   .389503   .668508   -1.48066  -.049724
.157459   -.179558  -.038674  .093923   .044199
.220994   .309392   -.071823  -.254144  -.060773

Matrix A times inverse of A = Identity Matrix
1.00000           -2.22045E-16  -1.11022E-16  -2.22045E-16  -2.77556E-17
2.22045E-16   1.00000           -2.77556E-16  -2.22045E-16  5.55112E-17
0.00000E0       -2.22045E-16  1.00000           4.44089E-16   5.55112E-17
1.11022E-16   -2.22045E-16  -3.33067E-16  1.00000           -5.55112E-17
2.22045E-16   -8.88178E-16  -1.11022E-16  8.88178E-16   1.00000
 ok
hi
Input dimension of Matrix to be inverted? 3
Input row 1
? 1
? 0
? 0
Input row 2
? 0
? 2
? 0
Input row 3
? 0
? 0
? 3
Matrix A =
       1.00000       0.00000E0       0.00000E0
     0.00000E0         2.00000       0.00000E0
     0.00000E0       0.00000E0         3.00000

Inverse of A =
       1.00000       0.00000E0       0.00000E0
     0.00000E0         .500000       0.00000E0
     0.00000E0       0.00000E0         .333333

Matrix A times inverse of A = Identity Matrix
       1.00000       0.00000E0       0.00000E0
     0.00000E0         1.00000       0.00000E0
     0.00000E0       0.00000E0         1.00000
 ok
3 sigdigits !  ok
main
Fileid is: 1212
139 Bytes are read into the Fadr RAM buffer!
Matrix A =
1.00         0.00E0     0.00E0     0.00E0     0.00E0     0.00E0     0.00E0     0.00E0 
1.00         1.00         0.00E0     0.00E0     0.00E0     0.00E0     0.00E0      0.00E0 
1.00         1.00         1.00         0.00E0      0.00E0     0.00E0     0.00E0     0.00E0 
1.00         1.00         1.00         1.00          0.00E0     0.00E0     0.00E0     0.00E0 
1.00         1.00         1.00         1.00          1.00         0.00E0     0.00E0      0.00E0 
1.00         1.00         1.00         1.00          1.00         1.00         0.00E0      0.00E0 
1.00         1.00         1.00         1.00          1.00         1.00         1.00          0.00E0 
1.00         1.00         1.00         1.00          1.00         1.00         1.00          1.00 

Inverse of A =
1.00         0.00E0     0.00E0     0.00E0     0.00E0     0.00E0     0.00E0     0.00E0 
-1.00        1.00         0.00E0     0.00E0     0.00E0     0.00E0     0.00E0     0.00E0 
0.00E0     -1.00        1.00         0.00E0     0.00E0     0.00E0     0.00E0     0.00E0 
0.00E0     0.00E0     -1.00        1.00         0.00E0     0.00E0     0.00E0     0.00E0 
0.00E0     0.00E0     0.00E0     -1.00        1.00         0.00E0     0.00E0     0.00E0 
0.00E0     0.00E0     0.00E0     0.00E0     -1.00        1.00         0.00E0     0.00E0 
0.00E0     0.00E0     0.00E0     0.00E0     0.00E0     -1.00        1.00         0.00E0 
0.00E0     0.00E0     0.00E0     0.00E0     0.00E0     0.00E0     -1.00        1.00 

Matrix A times inverse of A = Identity Matrix
1.00         0.00E0     0.00E0     0.00E0     0.00E0     0.00E0     0.00E0     0.00E0 
0.00E0     1.00         0.00E0     0.00E0     0.00E0     0.00E0     0.00E0     0.00E0 
0.00E0     0.00E0     1.00         0.00E0     0.00E0     0.00E0     0.00E0     0.00E0 
0.00E0     0.00E0     0.00E0     1.00         0.00E0     0.00E0     0.00E0     0.00E0 
0.00E0     0.00E0     0.00E0     0.00E0     1.00         0.00E0     0.00E0     0.00E0 
0.00E0     0.00E0     0.00E0     0.00E0     0.00E0     1.00         0.00E0     0.00E0 
0.00E0     0.00E0     0.00E0     0.00E0     0.00E0     0.00E0     1.00         0.00E0 
0.00E0     0.00E0     0.00E0     0.00E0     0.00E0     0.00E0     0.00E0     1.00 
 ok

The format of data to be stored in MatInvData01.f is as following:

8
1 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0
1 1 1 0 0 0 0 0
1 1 1 1 0 0 0 0
1 1 1 1 1 0 0 0
1 1 1 1 1 1 0 0
1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1

●雲端FORTH之我見

以後的雲端式FORTH系統,現在就能指出它的問題,我也不願涉入太深。因為FORTH打從發明之日起,就強調它能被使用者完全自我掌握,不需要雲端。將來雲端普及之後,凡人必須心甘情願的被奴役於那種付費環境中使用電腦,到那時,個人電腦很可能會只剩下FORTH單一種程式語言可用,因FORTH可以不需要花錢購買,沒有供應來源,就自己安裝,已經四十幾年如一日,再過百年,還是一樣,自裝辦法,只會越來越好,越來越快,越來越容易。

我堅決反對政府以人民的血汗錢協助任何私人搞雲端發展,它只宜在國家的正式體制內接受監督而發展。體制外想搞的人,就算號稱將來發展完成的雲端資源,打算免費提供人民使用,政府也不應該涉入。有人高喊『文創』、『雲端』、『數位』蠱惑民眾,吃定人民搞不清楚狀況,骨子裡卻想搞『文革』、『霧端』、『卡位』,動輒要求政府配合投資,一搞就是多少『億』!實在令我看不下去。有真本事、真意義的雲端發展,應由想賺錢的人自己搞,否則實行這樣的政策,豈不就是搶劫人民的財產,轉交給已經是有錢人的資本家,用來發展能夠剝削更多世世代代人民資產的雲端應用?全民應該及早認清這樣的事實,如果這樣的政府老講不聽,人民就應該團結起來,直接打倒這樣的政府,然後必須瓜分被資本家劫走的財產,省、縣、市的地方政府,以及中華民國的中央政府都不例外。

雲端有雲端的適用領域,例如:我這個網頁就在雲端,已經累積了可觀的資料。提供服務的公司,不限制想要申請建網使用的人數,來訪的觀眾更不受限制,算是雲端應用的典型方式。它不用拿人民的血汗錢來支持發展,照樣賺錢過活。

FORTH絕對不需要雲端,雲端有再好的FORTH,也絕對比不上我能完全掌握的FORTH,否則我早就會像傳統FORTH的專家一樣,不用再搞FORTH,也不用再搞電腦技術發展的事情。

不搞FORTH的人,就算只想隨意使用一下FORTH,都相當困難了,不會去碰雲端FORTH。

現行FORTH已經這麼方便了,都沒人用,何況是必須侷限到雲端去用?

單以手機上網,只願意單指觸控,再用FORTH的情況,那就更不用談了。

雲端上搞這種FORTH,就好比是在山頂上挖了一個養魚池,然後就窩在池旁工寮裡面規劃航空母艦,是差不多的意思。但不要認為航母搬不下山就不規劃,台灣就有很多造船、航空的大學科系或研究單位,就建在山頂上。

硬要舉出正面實用的例子,不是沒有,如果FORTH教育已經普及於社會,在您網我也網,大家都願意網到雲端FORTH網頁之堆裡面去的時候,進行一些整理群眾資源(Crowd source)的運用,研究問題,彙整出全盤結果,就是很有意義的事情,史丹佛大學有過這樣的應用實例,可以參考,在台灣,可以跟中央研究院合作發展。

發展雲端FORTH,是不是又再度陷入了人人都想設計殘缺FORTH的窘境?然後自己都不用,卻希望別人都來用,都只想賺別人才來用的錢。這種錯誤的想法,已經錯得太久了,起因就是長期以來,大家都不用FORTH設計程式,就沒能力使用FORTH直接設計出『產品』,才老是賺不到錢,卻誤用它容易自建的便利性,到處去設計殘缺的FORTH『系統』,包括雲端FORTH系統,形同想將已所不欲施與別人,結果,最後還是賺不到錢。喜歡搞雲端FORTH的人,在涉入之前,也應該先行徹底了解這一點。

三年多前,我就在網上跑過以JavaScript設計而成的雲端FORTH系統,不是下載設計來跑,它只能在網頁上跑。2009-1-11就在這裡刊出過的網文:『關於FORTH與其他軟體共容的問題』一文中,曾經介紹過。那時之前,就已經有人寫成了這個系統,放在網頁上供人自由使用。但是,一跑死就難繼續,玩不到核心,更別談自己修改。我在該文中的敘述,是這麼說的:

『也有人用JavaScript寫成它,今天在網上還存在,可以去跑跑看,痛苦的很,沒兩下就當機了,有人認為它有用,來玩的人就請忍耐它在發展初期的不太好用,只要它能活下去,以後會改善,今天能用的FORTH都是這樣產生的。』

三年後的今天,已不能再稱為『初期』了,透過與爽兄的接觸及介紹,再跑jsFORTH,發現它根本就是以前跑過的同一雲端FORTH,當初性能不好,我才不留網頁地址,現在它只不過是多了幾個指令,依然是一跑死就難繼續,仍然玩不到核心,情況不變。這樣搞下去的產品,很難成為真會使用FORTH者願意接受的東西,不會FORTH的人也玩不出名堂,所以是很難引起使用興趣的產品,過去這三年已經是這樣,台灣人現在才玩它,它不是新鮮東西。

也沒有任何台灣人的雲端FORTH觀念或技術,比jsFORTH的設計人早幾年。

設計者總不能強詞奪理,硬是說:別管我能否設計得出健康系統?反正也沒人會用吧!使用者的需求,就是市場導向,不能任性設計東西。我現在就是最好的試用者,可以講出別人講不出來的核心問題。能用的雲端FORTH,必須設計成一跑死就顯示訊息回到原點,要讓使用者能夠純粹就用FORTH直接玩到核心,雲端式的FORTH也不能限制使用者不能這樣或不能那樣,使用者要用這個FORTH來控制雲端時,系統也不得限制,否則使用者就不用這種FORTH。這些要求,必須突破網頁瀏覽器( Web Browser )的安管設計,辦得到嗎?辦不到這樣的設計,就難令人產生使用興趣。我們不需要一再設計類似8 bits一個byte,8 Kbytes就能具有一般功能的FORTH系統,那是40幾年前的產品。那一種需求?才是須要依靠雲端以設計大於幾個T(Tera,10^12)bytes系統似的應用呢?少之又少,幾近於零,不採用FORTH也能解決那種問題,所以FORTH實在不需要雲端。

我認為沒有必要為這種FORTH系統,加設計ABC FORTH系統性的功能。網頁上同樣性質的VBS系統,是微軟自行發展出來的新產品,那個尾綴的S,就代表Script,與最近大家想玩的JavaScript相當,都是用來設計網頁的工具,它早就能夠直接利用主機作業系統的現成功能,就在網頁上直接跑精簡BASIC式的數學計算程式了。為了配合大家突然興起的雲端FORTH熱,我花了不少時間,回頭仔細試用過雲端VBS跑法的性能,研究過所有現成指令,自己動手設計了幾個VBS的典型程式。最後發現,其現行功能也是礙手礙腳,關鍵缺點就是輸出太不自由,經常得考慮隔閡思想的另外一個物件(Object),這是當初Visual BASIC全面失敗,無法再像傳統BASIC,能被全面接受的根本原因。因此,它必然再度失敗,網上早就公佈了可以免費使用的系統,許久之後,也沒有人喜歡用,所以FORTH何必跟進?我曾經為C式FORTH浪費過不少時間加設計ABC FORTH系統,知道問題所在,以後不再上當了,希望將來以JavaScript繼續發展的FORTH系統,不會落得同樣下場。

那種雲端式的設計,現在暫時只配稱為噱頭。就像當初電話線上的BBS網站,市內電話三分鐘一塊錢,長途電話費更是貴得不得了的用法,用了就如同『花錢如流水』,我根本不可能去使用。我年輕時掌握了時機,曾經及時辦到過幾次『賺錢如洪水』的理財安排,而且終身嚴格遵守『花錢如滴水』的永恆規矩,老來才有老本,搞FORTH閒渡日子,不怕任何世界金融危機。我並沒有可以吃『終身俸』的資格,一切生活費用,全靠自己賺取,現在能擁有處之泰然過日子的良好環境,可能跟當初就認清了BBS,與現在就認清了雲端FORTH的事情有關。因為,這兩樣產品都違背了『開源節流以渡人生』的優良人生基本哲理。

當初,一開始有人推廣BBS網站,我就宣佈了它的死期,不願意支持那樣的網站,我認識好幾個曾經設立過BBS網站想賺錢的人,七早八早就垮掉了,以後的雲端FORTH,必然也是如此。更何況台灣能夠花錢如流水的能力,越來越薄弱,以後更難以『不當一回事』的錯誤生活態度過日子,社會消費方式必須回歸正常,經濟活動才能永續。將來的個人電腦,若迫不得已只能連到雲端,我也絕不會糊塗到隨便去點用FORTH,讓人賺走這種錢。

現在,大家若想認識一下雲端FORTH,淺嚐即可,切莫虛渡光陰而太慢下車。我不反對任何新形態的FORTH應用研究,包括JavaScript設計的雲端FORTH,所以自己也曾親身體會實際使用。但永遠不會改變的基本原則,都可以事先就想得很清楚,大家別因想賺錢想昏了頭,陷入太深,甚至於虧光了應該用來養老的老本,包括可貴的人生,到時走不下去,就不能再說是無知才造成無意義的損失,因為,我現在就能說清楚的問題,就不是無法預知的問題。

這一段話就算是建議性的FORTH經驗通告。要驗證我的建議對或不對?也很簡單,這篇通告是不必撤文的,幾個月後再回頭比對此文,看看雲端FORTH能耐多久?會不會比C式FORTH更為短命?不需要多久,就能知曉。

若不談三年以前的事情,就談最近這三年,來一次年終總檢討。我在積極承襲Win32Forth系統,使用FORTH實做出許多產品的這三年同一期間,大家曾經搞過了多少個走岔了方向的FORTH系統而沒有結果?請捫心自問,不要拒絕承認,或鐵齒硬說一個都沒有。您不可能一夜之間,就能產生今天這種想用FORTH來發展各種東西的念頭。如若有過這些教訓,還不能徹底覺悟,這將會是老來一大把年紀,卻仍然一事無成的關鍵因素,到那時才後悔,就來不及了。此事不用舉證,至少此前三年,沒有人有事有成,三年不是個短時間啊!乖乖用FORTH寫程式,設計產品吧。

●空談FORTH是個笑話

對於不寫程式只會空談的人,我也有些話該說,這三年期間,就我所知,丁陳老師獨自使用F#FORTH系統,已經寫成不知多少個都有執行結果的實際程式了。丁陳老師所用的系統比我用的還要辛苦,他比我年長12歲,還能如此,各位呢?該不會是學生當家作主的說:當老師的才應該習作,必須寫程式給學生改吧?台灣有這些反過來的現象,難怪令FORTH無法進步。三年天天空談,搞不出任何一個名堂,還想再空談三年?成為空談專家?是不是想憑空談談死FORTH?這必然就是個笑話,大家都一定會比FORTH先死,不是嗎?

再說,只要能上網,就沒有只有某人能看,而別人看不到的資訊,就算綠壩阻擋,翻個牆也都辦得到。我當然也常上網,閱讀某些領域的技術資料,速度比常人快,從網上,確實可以看到,全世界已有無數個由FORTH設計出來的『產品』,但FORTH『系統』很少,性能優良的,更少。有產品的人都不空談,空談的人都沒有產品。

好像只有台灣人才老是為FORTH系統空談規格,而且可能是根本沒有用的規格,更過份的是,可能還是空談者自己根本也不會用的規格,因為自己根本沒用過,所以也根本不知道為何不能用?網上空談都留了記錄,自己讀一讀醒醒吧!

文末這一小節,就學大家也空談空談,講一些烏欸某欸(有的沒有的之台語),把空談當笑話過個新年,大家新年快樂。

●再度鼓吹『櫻花革命』

結束本文前,我在小真為教堂活動練習彈奏聖歌的鋼琴聲中,得到了平和愉快的心情。也瀏覽到網路上一則報導日本今年四月,可能全面停止五十四處核能電廠發電運轉的新聞。

某些事情,我與一般人的看法不同,我也早就提出過鼓勵日本全國國民進行『櫻花革命』的個人見解,它還刊載在『地震專文之三』一文中,這裡再度為了強調而轉載一次。

我並非一個唯恐天下不亂的無知者,卻比任何人都更期待與盼望世界和平,如果日本人的『櫻花革命』能夠成功,我會實現我的諾言,反過來鼓吹全世界『善待你們』,鼓吹大家接納日本人。

福島核災之後,日本人的生活空間再度被自己的惡劣行為壓縮得更為窄小了,還繼續搞下去,以後怎麼辦?

決定不搞而『無核、無兵』了,我就會全力協助你們,鼓吹世界各國『善待你們』。

澳洲、加拿大、俄羅斯…等國,都還有廣大空曠的領土,可以多接受一點願意和平過生活的日本人。

美國對著你們實際丟過兩顆原子彈,瞬間就殺死了那麼多日本人!弄得炸過的空間永遠受害,那種世世代代永遠忘不掉的痛苦與仇恨,只有日本人自己最知曉,你有核、有兵,我就絕不相信你不回敬美國。所以就算美國的生活空間再擠,擠了三億多的人口,美國在道義上還是應該騰出一點空間,來協助日本疏散核子災區的人口,但不能指定在內華達州,那裡搞過太多核子試爆。

中國雖擠,必然也願意善待『無核、無兵』的近鄰日本災民,至少北大荒還有空地,可以接納一點災民,可以表示一點仁慈。

『櫻花革命』不一定要殺人、見血。

就像真誠研究四書、論語,建立孔子講求的『博愛』、『道德』思想,靠的是筆桿不是槍桿。

轉載地震專文之三中鼓吹的『櫻花革命』

曾慶潭2011-04-02於紐西蘭
Ching-Tang Tseng
ilikeforth@gmail.com
http://forthfortnight.blogspot.com

我對日本政府的作風確實憤怒,我支持日本全國國民立刻進行『櫻花革命』,支持他們『無核、無兵』的民意主張,完成了革命,繼續維新,才能得天之助,才能無『大津波』(日語的大海嘯)。全世界的日本人必須永遠記住!有格有方的中國人不會想去欺負日本人,但是,只要你們有核、有兵,中國人就不可能善待你們,這是目前全世界最有道德修養、博愛世人之中國人,所能教導你們治理國家的最正確方法,它的精神來自四書,是孔子的思想。維新只學西方資本主義國家的投機、貪婪,只不過是維了半新,健全的道德思想只有中國才有,學了才能維成全新,我勸你們不要因為只維了半新而自取滅亡,所以全力支持你們進行『櫻花革命』。

台灣同胞則請不要光看文章而忘了深自反省。