2026年8月2日 星期日

巧然天成的 RUN 指令

巧然天成的 RUN 指令


曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
2 August 2026


實踐確實是檢驗真理的唯一標準,真正親自動手做過事情的人,才有資格講這句話,能講出這句話的人,也才能體會出真理的可貴。我是以整合許多名家作品的方式,設計出 ABC FORTH 數學計算系統,憑心而論,名家作品中的許多伏筆,均非淺顯而易見,設計當初,我自己並不完全知道系統竟然另外擁有許多性能,這樣的問題,唯有依靠實踐來檢驗,本文討論一些這種特性。

這個系統擁有遠大的前程,充滿著無限的發展希望,就如同 FORTH 程式語言可以無限制成長的本質一樣。但其意義並非單純的只是指令名稱可以無限的增加,也不是發展到可以直接應用於處理問題後就此作罷,而是顯現在系統無窮的性能增建能力上。這種吸引人的特質,經常會令我只顧勇往直前添加新的設計,不顧驗證已經完成的成果;只想拼命的增添系統性能,無暇管它到底能做甚麼?

如果仔細回顧我所參考過的名家設計,確實能夠體會出許多可圈可點的名家技術,但是,如果只是照抄這些技術,缺乏自己的組織構想,最後必然難成氣候,在我設計的系統中,可舉出來的這種例子很多。 ABC FORTH 數學計算系統內,由 FORTH 轉進 BASIC 式環境後,其中一個性能特異的 RUN 指令,就是一個最典型的例子。

我設計 ABC FORTH 系統時,最原始的根據是莫查理(Charles H. Moore)於 1981 年發表的論文,裴麥克(Michael Perry)隨後將其改寫成 fig-FORTH 的版本。此後,因為只須照抄,我們便能很快的將同樣設計轉進了 F83 系統,繼續維持它的存在。

翻閱這些過去的舊記錄,很容易看得出來,幾位名家都只將 RUN 指令,當作 BASIC 程式語言中,最原始定義的意義來設計。那種 RUN 指令,只能讓單一個 BASIC 程式被系統執行,與我所設計的 RUN 指令不同,我的 RUN 指令,允許無限個 BASIC 程式可以被系統執行。

因為,當時,大家只想驗證出 FORTH 很容易設計出 BASIC ,確實也辦到了,但沒有人想到要根據 RUN 指令的特性來改善系統性能。

近代 FORTH 大型系統中,健全的浮點數計算能力,以及由作業系統自然融入 FORTH 系統的中文顯示功能,是兩件吸引我選擇這個時機,在 FORTH 系統中重現 BASIC 功能的主要因素,其他大型 FORTH 系統優秀的特點都在其次。

2008 年,我在 Win32Forth 系統中完成加建 BASIC 功能的初期,並不看好這樣的設計。道理無他, 1964 年發明的 BASIC 舊觀念並不吸引人,舊觀念還有許多長期被人攻擊的缺點,例如: BASIC 中的 GOTO 指令,會令龐大的程式,形成麵條式的結構,自認為是電腦專家的人,就拿這樣的論點來嘲笑 BASIC 。我自己從不這樣批評 BASIC ,相反的,還特別鍾愛 GOTO 這種指令,道理無他,一切電腦軟體的基礎 -- 組合語言中,凡會跳躍分支的 jump 指令,都與 GOTO 相當。因此,無 GOTO 何來其他所有的程式語言?講句不客氣的話,結構化程式語言中,想添加能讓系統不出亂子的 GOTO 指令,根本很難設計,排斥 GOTO 的專家,是不是酸葡萄心理?確實難說。要不然,請以實踐檢驗真理,檢驗完了,大家也可以不用,以尊重您高尚的論調。

我常認為,自封為專家的人,都應該謹言慎行,他們的一舉一動,對社會影響重大,性能非凡的 GOTO 指令就是這樣被毀掉的。但是,請仔細想想看,多少人過去就用 GOTO 完成了多少偉大的事情? GOTO 對整個社會總的貢獻,絕對比任何一位自以為高尚的電腦專家要來得多多, GOTO 何辜?

為了這個 GOTO ,我長期思考對應之策,因此,系統設計完成之後,足足有半年時間,我並不想對任何人介紹我所設計出來的系統。思考的問題,就是如何解決被批評為『麵條式程式』?的問題,而且設定了自己的打算,如果解決不了,就不要推出自己的設計,因為歷史已經淘汰了傳統的 BASIC 。

最後,自己私下決定,經由 RUN 指令來代勞,改變它的特性,而且解決辦法精簡之至,僅只是大膽起用一個從不被列入作為標準指令,卻是每一個 FORTH 系統內必定都有的天王指令『INTERPRET』。此一自創附加技術,是一種巧然天成的安排,足夠擠進名家之流,讓我敢將自己的設計,加寫進入 Charles H. Moore 的名著,從此與他的技術共存。

在前已刊出的好幾篇文章中,可以見到 INTERPRET 指令的全盤精神,它主宰 FORTH 系統的一切。 FORTH 系統執行起來之後,系統等待著接受輸入。一旦有了輸入,就從系統中比對輸入是否為一個指令? 是,就將其執行掉,不是指令,就試著將輸入轉換成數字,轉得成就放在堆疊上,轉不成就反問使用者,這是甚麼東西?然後永無止境的繼續循環,這麼簡單的主宰工作,就由 INTERPRET 完成。

教科書不教使用者如何用它來設計程式?或如何發揮 INTERPRET 指令的基本精神?我在這裡傳播這種技術,是補技術傳承上的不足,只是聊表善意而已,沒料到好心有好報, 2011 年 4 月起我開始使用 ABC FORTH 系統設計一些略有規模的應用程式,便實踐出了許多 RUN 指令的好處。此前,這些特性,連我這個系統的設計人,自己都不知曉。

系統中的 BASIC 程式,原本只強調用來改善 FORTH 執行數學計算程式的能力,其他的功能,全依靠 FORTH 原有的基本性能,都能另外完成。這樣的思考方式,確實是輕忽了 BASIC 在 FORTH 系統中的地位了,好像只宜將數學計算交給 FORTH 中的 BASIC ,其他的都不適宜。但是,實踐大型程式的設計後,才發現,其實不然!

三年前,我只耗用了大約 6 頁的程式,設計出 ABC FORTH 數學計算系統。最近卻耗用將近 20 頁的規模,設計出一個性能優越的大型應用程式。為了增加使用上的彈性,還刻意盡量將大型應用程式,分割成最小單元的模組化格式。最後,就靠可以不限使用次數的 RUN 指令,來整理出更清楚明確的結果。 RUN 指令的內容,相當於只有 INTERPRET , RUN 存在於 BASIC 中時,就好像是 BASIC 可以叫用執行無數個 FORTH 系統。他的巧然天成特質,絕對能令人嘆為觀止。

以前,我在使用傳統 BASIC 設計大型信號處理程式時,經常苦於系統不允許使用者,可以同時開啟好幾個被順利執行的程式,而必須進行繁雜的人工操作。例如:我建成過一套系統,能夠自動讀進輸入硬體數據信號,系統可以選擇要不要進行信號的過濾處理?或直接進行從時域(Time domain)轉換成頻域(Frequency domain)的快速傅利葉轉換(FFT,Fast Fourier Transform),最後,還有決策程式必須執行。那時,一次只能開啟一個程式被 BASIC 系統執行,用起來痛苦得很。因此,每當見到 FORTH 同好在精研其他的 BASIC 系統時,我首先向他請教的問題,就是這個 BASIC 一次能跑幾個程式?答案是,就算行,數量也是非常有限的。 ABC FORTH 隨您設計,跑幾個都行,直到系統記憶體容量裝不下了為止,這種性能,靠的就是巧然天成的 RUN 指令。

這個 RUN 指令的性能,首先讓『麵條式程式』不見了,就按照電腦高尚專家的踹言踹語,設計符合他們要求的程式,我將 BASIC 大型程式全面模組化,僅只剩下幾個 GOTO 指令,自由使用於單一模組之內,以少於一個螢幕畫面的短程距離內自由跳躍,沒有看不懂的地方、沒有分析不了的流程、沒有不安全的例外、沒有陷入無限循環的可能,這些缺點,全都不會再在程式中發生了。

不再有開檔數量限制之後,許多程式也不用自己重新設計了,就大方的用滑鼠去複製別的程式,供自己使用。嫌別人純用 FORTH 寫成的程式,不容易看懂,日後會有追查上的麻煩,索性就直接黏貼在上或下方,然後邊追蹤、邊改寫成我的 BASIC 格式程式,結果是程式永遠可以看得清楚明白,更加好用了。這樣做,改成的 BASIC 程式,並不會增加記憶體的耗用量,也不會令執行速度變慢。因為,前引的列首編號不會被編譯進系統,而且 BASIC 式的一列程式,除數學式子之外,都只會被編譯成單一個 FORTH 指令而已,程式被執行的速度當然不會變慢。也沒有多耗用記憶體,這種情況,就形同原為橫式書寫的 FORTH 程式,現在改為直式書寫的 BASIC 程式,如此而已。

這兩段敘述,告訴大家,我改善了 FORTH ,同時也改善了 BASIC 。更有甚著,可以建議有心的讀者,仿照同樣方法,將別的程式語言建進 FORTH 系統後,改善它們的性能。有一位小老弟,熟 LISP ,他也留心國際舞台上用 FORTH 設計出來的 LISP ,何不試試我的建議?自己跟著創造出另外一套別有風味的 FORTH 中的 LISP 。也有人用 FORTH 設計出 C ,何不像我一樣?大膽起用巧然天成 RUN 指令的來源 INTERPRET ,建成之後,絕對能帶給您意想不到的效果。如此必能實現由 FORTH 來統管一切程式語言的性能,這些 FORTH 哲理的高度運用,絕對不是我一個人的專利,但也不是應該由我來實現它們的責任。

像我一樣,單只搞 FORTH 的同好,透過這篇網文,您熟讀融會貫通之後,也應該可以大大增高自己的 FORTH 功力。學一個沒人教您的 INTERPRET 指令,可以在 FORTH 系統中再執行 FORTH ,讓程式有多重層次性,這在除錯系統中的斷點式性能規劃上可以用到。也在 FORTH 駐留後再執行一個 FORTH 時,可以用到。其他還有許多例子可以舉出,用法是不勝枚舉,我寫不完。但請大家記住, INTERPRET 是每一個 FORTH 系統都有的指令,卻不是一個標準指令!

坐而言不如起而行,我就用 RUN 指令將 FORTH 翻譯成 BASIC 給您看。在 Win32Forth 系統中繪出柵格線原為 FORTH 格式單一指令 GRID 的程式如下:

 


: GRID
  green line-color
  0 0   moveto 800 0   lineto
  0 100 moveto 800 100 lineto
  0 200 moveto 800 200 lineto
  0 300 moveto 800 300 lineto
  0 400 moveto 800 400 lineto
  0 0   moveto 0   400 lineto
  200 0 moveto 200 400 lineto
  400 0 moveto 400 400 lineto
  600 0 moveto 600 400 lineto
  800 0 moveto 800 400 lineto
;

直接翻譯成 ABC FORTH 中 BASIC 式程式,但仍然還是 GRID 單一指令的新格式如下:

: GRID   BASIC
10 RUN  GREEN line-color
20 RUN    0   0 moveto
30 RUN  800   0 lineto
40 RUN    0 100 moveto
50 RUN  800 100 lineto
60 RUN    0 200 moveto
70 RUN  800 200 lineto
80 RUN    0 300 moveto
90 RUN  800 300 lineto
100 RUN   0 400 moveto
110 RUN 800 400 lineto
120 RUN   0  0 moveto
130 RUN   0 400 lineto
140 RUN 200   0 moveto
150 RUN 200 400 lineto
160 RUN 400   0 moveto
170 RUN 400 400 lineto
180 RUN 600   0 moveto
190 RUN 600 400 lineto
200 RUN 800   0 moveto
210 RUN 800 400 lineto
220 END
;



這還僅只是第一個直截了當,最簡單的範例。設計大型應用程式之後,還有更驚人的發現,總結下來,就是:

1. 凡是 FORTH 系統中可以單獨被執行的指令,都可以用 RUN 指令直接叫來使用,而且同時用幾次都無所謂。
例子無數:如 ABORT 、 PAGE 、 BEEP 、 SPACE 、 CR 、 HEX 、 DECIMAL 。。。。。 等都可以這樣用。

2. 凡是執行前只需提供數字,執行後不在堆疊上留下數字的任何指令,也都可以用 RUN 指令直接叫來使用,但每一列只限使用一次。
例如:上述所舉的程式翻譯例子 21 1 AT-XY 、10 SPACES 、1000 MS 、42 EMIT 。。。。。 等,可用範例也是不計其數。

簡而言之,這兩條規矩就是:一次 RUN 一個指令, RUN 完不留參數。

這裡僅只是隨便舉幾個例子,但請不要小看這樣的應用。

我一直強調,當初設計 ABC FORTH 系統,只是為了想改善 FORTH 不良於數學計算程式的原始性能,才選擇以 BASIC 格式達到目的,但並未設計出許多傳統 BASIC 該有的指令。例如:傳統 BASIC 中有一個將螢幕清空的 CLS 指令,根據上述實踐出來的性能,巧然天成的由 RUN PAGE 直接代換就能辦到。使用者想跳空三列後才印出執行結果時,不須要使用三次 BASIC中 的 PRINT “ “ 指令,可以改用 RUN CR CR CR 來完成。所有螢幕上游標的控制,與繪圖程式所有的操作指令,都可以直接由 RUN 指令叫用。這些發現出來的性能,代表我未為 BASIC 設計螢幕控制指令,卻由 FORTH 系統原來的性能自然融入了, RUN 指令怎麼不是巧然天成?

上述例子舉用了 RUN ABORT ,也是一項有意義的新發現。我在 2009 年十月刊出的一篇『實係數代數方程式的解法』(Solve algebraic equations of real coefficients 已撤文)網文中,為了要與日本教授 Yuji Kida 所設計的 UBASIC 性能比個高下,直接改寫他的程式,並要求一定要直接改寫得成,不幸遇到一個程式中可以隨便從有限循環中跳出來的指令,阻礙直接改寫,日本人將此指令命名為 cancel for ,當時,我不服輸,硬用系統測試出此指令的性能,結果,最後的解決辦法,是以定義出自己的 CANCEL-FOR 指令,其內容為使用四個 DROP 來達到目的。現在,實踐 ABC FORTH 後的經驗與觀念都更清楚了,事實上,只需在程式結束前,執行 RUN ABORT 便可以了。

為了發展大型應用程式,我必須參考許多很有用之 BASIC 、FORTRAN 。。。。。等舊有大型程式,發現裡面有很多這樣的程式設計方式,這個巧然天成的 RUN 指令,協助解決了這種困惑,當初,我並未為系統中的 BASIC ,設計出可以執行 ABORT 的功能,現在它自己跳出來協助我解決問題了,怎麼不是巧然天成?

自行使用 ABC FORTH 系統累積出來的實踐經驗,增強了我自己使用此系統的無比信念。Charles H. Moore 曾經公開質疑搞原子爐應用程式的人,為什麼要把程式寫成幾萬列?我從這個領域出身,雙方我都不予以否定。但是,現在,我卻絕對有信心,敢於明確的指出,如果搞原子爐的人,非得使用萬列以上的程式來求解問題時, ABC FORTH 數學計算系統,絕對能妥善的代勞,完成任務。

舉例而言,一年調整一次的爐心燃料,就得動到幾千幾百根燃料棒,根根都價值斐然,那麼,為了很有效率的營運這些燃料棒,使用萬列以上的爐心燃料營運程式,也就不足為奇了。這種程式,現在交給我來改寫成 ABC FORTH 系統可以直接執行得出來的程式,我也絕對辦得到。而且,日後發展 64 位元的系統普及之日,這種程式就不需要再行改寫,可以確保它 50 年能用。 50 年,是一個比任何原子爐可用壽命,都要來得更長的年限!我估計,只要勇敢承包這項工程,絕對能從中獲得豐厚利益,但卻是善事一樁,只是現已不喜言『利』,我只在乎如何提供 ABC FORTH 系統?能夠供給大家永遠使用。

除了 RUN 指令外,經由實踐,我還發現了其他也是巧然天成的一些性能,這種現象,意味著已經設計好的系統,還有許多隱藏的特殊性能,連我這個系統設計人都還不知曉,令我大為振奮,深覺更應該加強使用 ABC FORTH 系統來設計大型應用程式的機會,就能累積出更多的成果。

即時性交談(Real time interactive)性能,是 FORTH 與 BASIC 程式語言都具有的特性,也是別種程式語言所缺乏的特性。應用程式設計多了,就很喜歡使用這種一般程式語言不便於使用的特點。如此設計出來的程式,被別的程式語言使用者看過之後,想抄都很難抄去使用,因為它們不適合執行與使用者之間的即時性交談,因此更能顯現出 FORTH 程式語言與眾不同之處。

我們若將即時性交談,鎖定在只對鍵盤的輸入反應上(實際上,則可以是系統內的任何輸入訊息),大致而言,這樣的即時性對談,可以分成兩類,一是希望鍵盤未被碰觸過,則系統不作任何反應,碰了就立即反應。二是系統停下來,等鍵盤被碰觸過後,系統根據鍵盤被壓下之鍵來決定程式執行流程的走向。對應到這兩種狀況的 Win32Forth 系統原有指令為: KEY? 及 KEY 。

那麼,我們如何以巧然天成的設計方式,讓這兩種功能在 ABC FORTH 統的 BASIC 環境內實現出來?第一種狀況,我設計了一個簡單卻能讓程式可以隨時因碰觸了鍵盤便立刻中止執行的指令,稱作 TERMINATED ,內容如下:

INTEGER A$

: TERMINATED BASIC
10 LET A$ = KEY?
20 IF A$ = 0 THEN 50
30 PRINT “ Program has been terminated! “
40 RUN ABORT
50 END
;

如果您希望在一個可能停不下來的迴路內,可以因為鍵盤的碰觸而立即終止,就將 RUN TERMINATED 插入到您想要控制的指定位置就得了,但鍵盤都沒碰觸過,程式的執行就不會中止。請注意!設計 ABC FORTH 的 BASIC 部份時, KEY? 指令根本沒有被規劃進 BASIC ,而且還不必經過任何使用前宣告,便能如上例般直接使用,反而是用來暫存狀態的 A$ 需要先行宣告,可是原為只屬於 FORTH 的 KEY? 指令,卻巧然天成的進了上述 BASIC 程式環境,性能好得很。

同理,您若是希望程式執行到指定位置,便希望透過您是否壓下鍵盤的 Y 或 y 鍵,來決定程式是否要回頭重新執行一遍?設計方法,也是巧然天成的,可以直接引用 FORTH 系統中原有的 KEY 指令,予以完成,系統執行到 KEY 指令時,會自動停下來,碰了鍵盤就有後續結果,設計方式就簡單到如下列所示:


 
-----
-----
190 -----
200 LET A$ = KEY
210 IF A$ = 89 OR A$ = 121 THEN -10
220 -----
-----
-----

兩個完整可以直接使用的測試範例,則如下示:

INTEGER A$

: Y? BASIC
10 RUN PAGE
20 RUN 0 20 AT-XY
30 RUN CR
40 PRINT " Do you wish to print yes? (y/n)  "
50 LET A$ = KEY
60 IF ( A$ = 121 ) OR ( A$ = 89 ) THEN 110
70 RUN CR
80 RUN CR
90 PRINT " No "
100 RUN ABORT
110 PRINT " Yes "
120 RUN 1000 MS
130 RUN BEEP
140 END
;

INTEGER COUNTER

: RANDOM-COUNT BASIC
10 PRINT “ Counting and terminate test is starting now ! “
20 LET COUNTER = COUNTER + 1
30 RUN 1000 MS
40 LET A$ = KEY?
50 IF A$ = 0 THEN -20
60 PRINT COUNTER
70 END
;



感覺出『即時性交談』的效果了嗎?體會出『巧然天成』的意義了嗎?這就是 FORTH 與眾不同的本質, ABC FORTH 使用說明並不需要因此而另行改寫。

我們可以利用上述的幾個特別性能,應用於一個完整的範例程式,以展示從不用這些性能,到妥善利用這些性能,所顯示出來的差別。

此處所舉之例為一個單只根據三角形的三邊長度,來計算出三角形面積的公式,此公式稱為海龍(Heron)公式, Heron 是生活在西元 10 年至 70 年間的希臘數學家,此公式是為了紀念他,才被如此命名。

誰都知道三角形的面積等於底乘以高除以 2 ,這個基本計算方法當然比海龍公式還好用。但是,讀者請注意,古時候丈量土地,沒有現在這麼好的輔助工具,那時只能輕鬆的量長度。想輕鬆的確定一個直角,再量三角形的高度,就有困難了,亂量一通就會引發爭議。所以,大約2000年前的海龍公式,在當時丈量大面積土地時,確實是個很好用的公式。三角形可以作為一切多邊形的基本單元,因此,任何多邊形的面積,都可以只靠量長度而計算出來,所以海龍公式很有用。

要設計這個程式並不困難,我們拿它來作為範例的目的,主要是想顯示,隨便設計一下,也能求得答案。但想讓程式萬用,不怕輸入錯誤,就得經過一點執行程序上的安全處理。又進一步想讓萬用程式真能萬用時,這一章所討論的內容,就能拿來實際應用,利用控制鍵盤的輸入鍵來達到目的。

程式內已經有詳細的發展程序說明了,我們只須刊載整個程式,及其簡單的執行後輸出結果。


 

\ Heron’s formula
\ 海龍公式為一根據任意三角形的三個已知邊長,自動計算出面積的公式。
\ 三個邊長為 A、B、C,而 S=(A+B+C)/2 ,面積則表示為 DELTA 。
\ 公式為:DELTA= SQRT( S*(S-A)*(S-B)*(S-C) )

REAL A
REAL B
REAL C
REAL P
REAL Q
REAL S
REAL DELTA
INTEGER A$

\ 最精簡程式

: HERON1 BASIC
10 PRINT " Please input A and B "
20 INPUTR A , B
30 LET { P = ABS ( A - B ) }
40 LET { Q = A + B }
50 PRINT { " C must be > " ; P ; " and < " ; Q }
60 PRINT " Please input C "
70 INPUTR C
80 LET { S = ( A + B + C ) / 2 }
90 LET { DELTA = SQRT ( S * ( S - A ) * ( S - B ) * ( S - C ) ) }
100 PRINT { " delta = " ; DELTA }
110 END
;

\ 增加安全檢查性能

: HERON2 BASIC
10 PRINT " Please input A and B "
20 INPUTR A , B
30 LET { P = ABS ( A - B ) }
40 LET { Q = A + B }
50 PRINT { " C must be > " ; P ; " and <" ; Q }
60 PRINT " Please input C "
70 INPUTR C
80 IF { ( C > P ) AND ( C < Q ) } THEN 110
90 PRINT " It’s out of range, re-enter Please! "
100 GOTO -50
110 LET { S = ( A + B + C ) / 2 }
120 LET { DELTA = SQRT ( S * ( S - A ) * ( S - B ) * ( S - C ) ) }
130 PRINT { " delta = " ; DELTA }
140 END
;

\ 增加即時交談性能

: HERON3 BASIC
10 PRINT " Please input A and B "
20 INPUTR A , B
30 LET { P = ABS ( A - B ) }
40 LET { Q = A + B }
50 PRINT { " C must be > " ; P ; " and < " ; Q }
60 PRINT " Please input C "
70 INPUTR C
80 IF { ( C > P ) AND ( C < Q ) } THEN 110
90 PRINT " It’s out of range, re-enter Please! "
100 GOTO -50
110 LET { S = ( A + B + C ) / 2 }
120 LET { DELTA = SQRT ( S * ( S - A ) * ( S - B ) * ( S - C ) ) }
130 PRINT { " delta = " ; DELTA }
140 PRINT " Repeat? (y/Y) "
150 LET A$ = KEY
160 IF ( A$ = 89 ) OR ( A$ = 121 ) THEN -10
170 END
;

((
\ 執行記錄

FLOAD 'C:\Win32Forth 6.14.00\ISO2011\海龍公式.F'  ok
heron3 
Please input A and B ? 3 4.0
C must be > 1.000000000 and < 7.000000000 
Please input C ? 5.e0
delta = 6.000000000 
Repeat? (y/Y) 
Please input A and B ? 3.00 4e0
C must be > 1.000000000 and < 7.000000000 
Please input C ? 5
delta = 6.000000000 
Repeat? (y/Y)  ok

))



20260802 編後記:

1. 我在所有後來發展的 ABC FORTH 系統中,為了簡化連續使用 RUN 與 連續使用 LET 指令時的方便,從第二列使用 RUN 指令開始,可以只用 => 符號式指令取代,而且不必再用列號。同理,連續使用 LET 指令的情況相同,可以只用 :: 符號式指令取代,也不必再用列號。

2. 我在貼出本文前,刻意修改了 HERON 程式,令其可在 Lina64 Forth 系統中也能執行。修改成果與執行結果列示如下:


 
\ Heron’s formula
\ 海龍公式為一根據任意三角形的三個已知邊長,自動計算出面積的公式。
\ 三個邊長為 A、B、C,而 S=(A+B+C)/2 ,面積則表示為 DELTA 。
\ 公式為:DELTA= SQRT( S*(S-A)*(S-B)*(S-C) )

7 REALS A B C P Q S DELTA
INTEGER A$

: HERON BASIC
10 PRINT " Please input A and B "
20 INPUTR A 
25 inputR B
30 LET { P = ABS ( A - B ) }
40 LET { Q = A + B }
50 PRINT { " C must be > " ; P ; " and < " ; Q }
60 PRINT " Please input C "
70 INPUTR C
80 IF { ( C > P ) AND ( C < Q ) } THEN 110
90 PRINT " It’s out of range, re-enter Please! "
100 GOTO -50
110 LET { S = ( A + B + C ) / 2.0 E 0 }
120 LET { DELTA = SQRT ( S * ( S - A ) * ( S - B ) * ( S - C ) ) }
130 PRINT { " delta = " ; DELTA }
140 PRINT " Repeat? (y/Y) "
150 LET A$ = KEY
160 IF ( A$ = 89 ) OR ( A$ = 121 ) THEN -10
170 END
;

執行結果:

ching@ctt:~$ ./l

AMDX86 ciforth 5.3.0 
fload heron.f
A : ISN'T UNIQUE                                                
B : ISN'T UNIQUE                                                
C : ISN'T UNIQUE                                                
 OK
heron

Please input A and B 
? 3.0 e 0

? 4.0 e 0

C must be > 1.0 E 0  and < 7.0 E 0  
Please input C 
? 5.0 e 0

delta = 6.0 E 0  
Repeat? (y/Y)  OK




沒有留言: