創造與實踐特別指令
曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
2 July 2026
創造(CREATE)與實踐(DOES>)兩個 FORTH 標準指令結合在一起使用時,形成一種任何其它程式語言所缺乏的特殊現象。
我將以特殊的手法介紹 CREATE ..... DOES> 指令組。就學習難度分類,這一組算是三級的難度,比二級的 WORD、NUMBER 難一點,比四級的 Multitasking 或 Meta-compiling 觀念簡單一點。
古時候, CREATE 的名稱為 <BUILDS ,而且設計出指令的方法有一點差異, 79 標準以後指令名稱就修改並固定成 CREATE 了。在台灣的 FORTH 同好, 1980 年代使用 AIM65 壓克力封裝的透明電腦、追蹤最原始被公開的 fig-FORTH 系統源程式、閱讀古老的 FORTH 技術文獻 ..... 等狀況時,還有機會見到被使用的 <BUILDS 名稱。我在設計 ABC FORTH 數學計算系統時,也久別重逢了這個指令,所依據的最原始程式,就用 <BUILDS 而不是 CREATE 。
我不跟寫別人的教材,如果沒有自己獨特的一套解說方法,來強化大家學會打算談論的主題,就不該浪費讀者閱讀本文的時間,所以,我會使用特殊的手法寫 FORTH 教材。
我的網文教材中大部份只有淺顯的觀念,但直接切中難了解的相關 FORTH 指令,教會您實際的使用方法。至於一般 FORTH 老手喜歡探討的指令詳細結構,我完全不提。因為,我知道,有一天,您渡過了使用 FORTH 創作程式的初期困難後,會主動的去追蹤每一個指令的細部結構,不需要別人督促。您若不能渡過那種困難,就不會進一步的想深入了解 FORTH 內在系統的結構。因此,教您那些東西,有可能是在浪費時間。現在,我們仍然從外在的使用觀點,經由特殊觀念了解 CREATE ..... DOES> 。
這份教材,調皮的部份,取材自 comp.lang.forth 網頁的一些討論,如果您英文已經看得很順當了,我也介紹您直接去參訪,它不是一個只有我能獨享的 FORTH 科技園地。另外,請不要輕忽那些討論內容,我尊重所有的專家,所以會有『網文』可能比『論文』來得快又來得重要的論點,這是莫之能禦的時代趨勢,老頑固、老學究堅持抵制說『它不正式』也沒有用,頭腦靈活的人早就經常拿這些技術先行實現了許多夢想,寫 FORTH 網文的好手,從來就不在乎公開任何好技術後,會失去可以取得成為博士論文的機會,他們在嘉惠大眾,我因佩服而學習他們。
一般而言,純用電腦專業術語來解釋 CREATE ..... DOES> ,可能還不夠強烈,學習者就不易搞清楚它們的意義,不能記住使用方法,也就難以用來設計特異程式,發揮別種程式語言所沒有的效果。靜宜大學的金城老師主要專長就是電腦,我們曾談過簡化這一組指令的中文解釋,他說:『我宣告一個資料結構,就是 CREATE ,而且決定要怎麼用就怎麼用,就是 DOES> 。』解釋得非常好,大家不妨就這樣記住它們的意義。可是,奇怪的很,他在自己的著作『FORTH 的禪思』第八課中,卻不用這麼言簡意賅的解釋,反而寫了一大堆說明。也許是著作付梓之後,透過交談,才激發出他的簡化潛能,他有空時確實該來與我們多聊聊天,有好的話語,我會幫他記述。
為了讓指令的適當中文名稱能通順的使用於文句中,符合中文文法,以便在傳承技術或進行程式說明時感到方便,我則給予這兩個指令下列中文譯名:
CREATE 創造(資料結構)
DOES> 實踐(後續指令)
此處仍是列而不議(爭議),讀者請笑納便可,我們的重點在只談技術。
這兩個中文名稱又好又偉大,它們的功能確實也是如此,誇張一點形容,單憑這一組指令的功效, FORTH 的性能就足以蓋過其他現行的任何程式語言,寫程式時還能隨心所欲的『創造』和『實踐』,豈有不被稱為最偉大的道理?
為了更清楚解釋它們的性能,我要離題另行介紹一些機械工程學方面的知識,引用這些知識來解釋,就能更加明白這種指令的性能,這樣子學習,有助於強化您的記憶,也增加您對機械工程方面的認識。
學機械工程會見識到許多重型的產業生產用機器,有一些機器被冠以『工作母機』的美好名稱,例如:古時候被稱作車床、銑床、刨床、磨床、鑽床、研床、搪床…者(簡稱:車銑刨磨鑽研搪),均可算是工作母機。其他的機器就不能被納入工作母機的行列,例如:沖床、夾床、壓床、軋床、鍛床、鋸床、油壓機、輸送機、放電加工機、射出成型機…等。這兩者之間有甚麼區別?簡而言之,生產出來的工件成品,可以直接當作其他機器之零件者,才能被稱之為工作母機,例如:車床車製出螺絲,可以給別的機器當零件使用,車床就是。反之,沖床沖製出金屬鍋、碗、瓢、盆,不能給別的機器當零件使用,沖床就不是。『工作母機』就是機器的母級機器,提到她會肅然起敬。
時代在進步,近代的工作母機有了一點變化,例如:機械引擎的活塞缸套,已經發展出了快速、簡便、經濟的生產方法,用搪床來搪缸的機械加工就減少了,這個工作母機也就逐漸式微而少見。又如:以銑刀銑製金屬工件表面的技術,發展得相當進步,製品的品質,已可媲美於傳統龍門刨床刨製出來的金屬表面要求,銑床可以同具刨床的功能,於是刨床也逐漸式微而少見了。現行機械工廠中可以人工操作的工作母機,大約只剩車床、銑床、鑽床三種機器,屬於必備,其他的則可以功成身退了。機器配上了協助自動化的電腦,則改稱 NC 工作母機, NC 是數值控制(Numerical Control)的意思,因為用來操控機器的電腦程式中,大量的使用指揮機器定位或定速所須要的數值,故得其名。機械工程系的學生,學習機械製造這一門科目時,會學到上述這些知識,進行工廠實習時,就會直接接觸這些機器。如果您希望一生都有機會運用機器來創造東西,那麼,大學就該選讀機械工程系,現在則專心談論我們的 CREATE ..... DOES> 兩個 FORTH 指令。
實際用過 FORTH 設計較高級程式後,您才會發現,多工程式(Multi-task)中的 NEWTASK、ALSOTASK 這種指令組,與現在正要討論的創造(CREATE)、實踐(DOES>)此一指令組,都像機械工程學中的工作母機,它們形同為『造指令的指令』,也就是它們都用來設計『零件指令』,再供『應用指令』使用,『應用指令』才能夠方便的被執行,它們就形同是『母級指令』,用到它們當然會肅然起敬。接下來,我們逐步介紹運用這組指令的使用範例。
FORTH 中的標準 VARIABLE 指令,也可以用上述 CREATE ..... DOES>『母級指令』來設計,這是最簡單的這一組指令使用範例,例如按照下列程式逐列操作:
: VARIABLE1 CREATE 0 , DOES> ; ok
VARIABLE1 TEST1 ok
18 TEST1 ! ok
TEST1 @ . 18 ok
這個 VARIABLE1 的功能,就與 FORTH 中的標準變數宣告指令 VARIABLE 完全一樣了。
其中, TEST1 相當於是一個『應用指令』,可以在程式中到處應用,它須要使用 VARIABLE1 這種『零件指令』才能宣告形成,而『母級指令』 CREATE ..... DOES> 則可以完成『零件指令』 VARIABLE1 的設計。
仔細追蹤 VARIABLE1 『零件指令』的設計內容,從創造(CREATE)資料結構開始,系統首先根據使用者隨後使用時,賦予的任意名稱 TEST1 ,在系統中創造了一個變數的資料結構,而且先將資料內容歸 0 ,創造到此結束。此後,每逢 TEST1 變數被應用而執行時,系統就實踐(DOES>)後續指令,此簡例中沒有任何指令,於是實踐(DOES>)就只執行將創造完成的 TEST1 資料結構之參數欄起始位址,放在系統數據堆疊上,僅此一項工作為實踐(DOES>)天生非做不可的實踐內容,實踐到此結束。
以前,有一個馬戲團小丑,在表演模仿走鋼索前,把地板掃一掃,想放置脫下來的外套,可是等他脫下外套後,卻把外套丟到很遠很遠沒掃過的地方去了。小丑的調皮,可以引起觀眾開懷大笑。我們也來學一學小丑,調皮的不按規矩使用這一組母級指令,依序執行下列程式,就能看到它們的效果:
: NAUGHTY1 CREATE DOES> DROP 1 . ; ok
NAUGHTY1 TEST2 ok
TEST2 1 ok
這組母級指令造好的 NAUGHTY1 零件指令,被 TEST2 應用指令使用時, TEST2 根本沒有資料結構的體部,也就是根本沒有內容,應用指令 TEST2 每次被執行時,卻都拓印出 1 ,它天生非做不可的實踐內容,實踐完了就立刻被丟棄不用了,這個程式就像上述的小丑,有一點調皮,卻產生了一點特殊效果。
既然調皮有點看頭,那就進一步調皮一點,看看使用兩組實踐 DOES> 配一組創造 CREATE 的效果,又會如何?依例逐列執行程式,得到了下列結果:
: NAUGHTY2 CREATE DOES> DROP 1 . DOES> DROP 2 . ; ok
NAUGHTY2 TEST3 ok
NAUGHTY2 TEST4 ok
TEST3 1 ok
TEST4 2 ok
您可以跟著調皮下去,看看續用這個 NAUGHTY2 零件指令,多宣告出幾個應用指令,會有甚麼結果?還有更調皮的設計,設計成下列:
: NAUGHTY3 CREATE BEGIN DOES> DROP 1 . DOES> DROP 2 . AGAIN ;
注意! BEGIN ..... AGAIN 是一個無限循環,這樣子設計程式,執行起來竟然可以不毀系統,而且您還可以照常在 ABC FORTH 系統中繼續發展程式,請您自己試一試這些現象,或者想辦法比上述所有程式更加調皮,看看能有甚麼結果?
我不聰敏,拿這樣的範例來應用,仍然可以設計一個上課點名遊戲程式,只是學生都是虛擬的存在電腦中。
\ 母級指令 CREATE ..... DOES> 測試程式
\ 作者:曾慶潭 2010-02-16
: 男學生 CREATE DOES> DROP ." 有!我是男的。" ;
: 女學生 CREATE DOES> DROP ." 有!我是女的。" ;
: 兩性生 CREATE BEGIN
DOES> DROP ." 有!我是男的。"
DOES> DROP ." 有!我是女的。"
AGAIN ;
\ (( 使用範例:上課點名遊戲程式
男學生 湯姆
女學生 瑪莉
兩性生 喬治
\ ))
您可以實際去執行一下,分別鍵入學生的名字後,看看結果。『喬治』則要多點幾次名,他(她)真的會忽男忽女,好像有一個名叫『喬治男孩』的明星就是這樣,他(她)們有公開存在於現今世界的權力,不要以異樣的眼光看待他(她)們。我們的 FORTH 真正是一個既古老又先進的程式語言,它憑著創造(CREATE)與實踐(DOES>), 在 58 年前(1968),就把今天這個時代的爭議性問題處理得這麼好。
談起如此的一組 FORTH 傑出指令,實在可以創作出無限的調皮話題。
我所設計的 ABC FORTH 數學計算系統,更是靠著它們才得以完成,系統裡面的所有變數結構都在變化。變數出現在等號『 = 』的左邊或是右邊時,性能就得不同。變數若使用於浮點數的環境,如果還得用到指標,它的指標就只能為整數,有幾個整數還得視情況而定。這麼囉嗦的要求,如果不用調皮的手法,可能很難完成設計。
能用上述模式解釋這一組傑出指令,平生就得多學、多用、多涉獵各方面的知識,頭腦才能有豐富的聯想力來進行描述,讀者可能看似簡單,實則未必,要強調這樣的論點,可以透過一個別人講過的笑話來形容它,您自己體會,同時結束本文。
一個幼年私塾,有一班幼童背頌了一段課文,內容是:
『人坐著吃飯,馬站著吃草。』
過了一會兒,私塾的老先生要幼童起來背頌這篇課文,小華先背,可是站起來就怕老先生用戒尺處罰,於是背出了:
『馬坐著吃草 ..... 』
大家都笑了,老先生有點生氣,用戒尺從輕發落了一下小手心就算了,換小明站起來再背頌,小小的心靈真可憐,同樣的狀況:
『人站著吃飯 ..... 』
老先生再輕輕的打了小明一下小手心,讓他坐下,然後說:
『這麼簡單都不會,現在大家把書本合起來,都跟著我唸。』
『人坐著吃馬 ..... 』
這兩天紐西蘭夜間的氣溫低於 0 度 C ,我準備貼文時確實有點冷。
沒有留言:
張貼留言