forth 和 代數表達式

65 views
Skip to first unread message

松涛

unread,
Apr 22, 2009, 8:44:13 AM4/22/09
to 符式協會
我自覺感覺forth處理自然語言會不錯,但不知道處理代數題,會不會方便。

例題
一根电线杆,埋在的下的部分是全长的十三分之二,露出地面的部分是5米。这根电线杆全长多少米?

我的解法:

variable out
variable all
variable in

13 out !
3 all !
2 in !

all @ in @ -
out @ swap /
all @ *
.

可是,這個與我們使用的代數表達式差距很大:
in = 2/3 all
out = all - in
out = 5

如果能像代數表達式那樣表達,也許會更容易理解和使用。
我是新手,所以貼出來看看大家有沒有碰到此類情況?

holi

unread,
Apr 22, 2009, 11:40:04 PM4/22/09
to 符式協會
我有這樣的寫法. x=y+z x=y+12 但是前面要加一個 `
請上 groups.yahoo.com/group/armForth 的files區下載 infix_paser1.f 討論

松涛

unread,
Apr 23, 2009, 11:33:34 PM4/23/09
to 符式協會
infix_paser1.f 我下載到了。
在gforth 和win32forth下運行,都出現問題。

gforth :

in file included from *the terminal*:0
infix_parser1.f:7: Undefined word
IF @ 0FFFF AND DUP>R [ ASCII 0 ASCII x 100 * + ] LITERAL =
^^^^^
Backtrace:
$7FB61DC5E7D0 throw
$7FB61DC73288 no.extensions

win32forth

FLOAD 'Z:\infix_parser1.f'
THEN FIND-BUFFER PLACE FIND-BUFFER ?UPPERCASE (FIND) ;
^^^^^^
Error(-13): (FIND) is undefined in file Z:\INFIX_PARSER1.F at line 48

請問,你用的是哪個forth?

燕南

unread,
Apr 24, 2009, 12:07:42 AM4/24/09
to 符式協會
以前 我寫過發表 (win32forth)

算式: ( 1 + 2 ) / 3 =

12 VALUE ABC
23 VALUE XYZ

算式: ( ABC * 45 ) + ( XYZ / 6 ) =

這種方式 ,用來解決 複雜算式 在後置 的 難以觀看 ; 你覺得如何呢?!


註: 透過 word & 反波蘭法的解析 來做這件事 ! www.figtaiwan.org 燕南的範例 看看還在嗎?!(n年前寫的,屢經
中研院 HD掛掉,不知在否)?!

> > > 我是新手,所以貼出來看看大家有沒有碰到此類情況?- 隱藏被引用文字 -
>
> - 顯示被引用文字 -

松涛

unread,
Apr 25, 2009, 3:32:52 PM4/25/09
to 符式協會
恩。我的想法是 如果 我給forth寫出(3x+1)=31 , forth自己會求出x的數值10.
這個要用到:
1. 對 表達式的解析成forth格式 --》 可以參考燕南的范例
2. 對 表達式轉換 求值 --》 是個逆向剝殼工作?

On 4月24日, 下午12时07分, 燕南 <ezfo...@gmail.com> wrote:
> 以前 我寫過發表 (win32forth)
>
> 算式: ( 1 + 2 ) / 3 =
>
> 或
>
> 12 VALUE ABC
> 23 VALUE XYZ
>
> 算式: ( ABC * 45 ) + ( XYZ / 6 ) =
>
> 這種方式 ,用來解決 複雜算式 在後置 的 難以觀看 ; 你覺得如何呢?!
>

> 註: 透過 word & 反波蘭法的解析 來做這件事 ! www.figtaiwan.org燕南的範例 看看還在嗎?!(n年前寫的,屢經

亞斯

unread,
Apr 26, 2009, 12:28:42 AM4/26/09
to 符式協會
對於極複雜的數學運算,我不會使用 forth,因為不同的語言有其各有其長處,如果我使用的是一個以 C 語言寫出的 forth ,我會以 c 語
言寫出一個函數來解複雜的數學問題,再建立 forth 呼叫的界面,這樣,我就可以很快地把資料放到堆疊並以 forth 呼叫那解數學問題的函
數。

如果我使用的 Forth 不是以 C 語言寫成,而是類似 eforth 以組言語言寫成。我仍然可以以 C 語言寫出那個函數,編譯時產生對應的組
合語言,再把組合語言修改後 copy 到 能和 eforth 連結的檔案內。編譯好後讓 forth 呼叫。

對於簡單的數學運算,我會直接用 forth 的解譯器及後置的方法來解題,把複雜的問題先拆成可以分別測試的片段。再在程式中加入中位運算的註解。這
樣,閱讀程式的人就能瞭解程式的作用。

說到這兒,我覺得有些新進的朋友把 meta compiler 當成 Forth 中一個很難企及的標的,以為不會 meta compiler 就
不是 forth 的高手似的。我認為在這多語言的時代, meta compiler 已經屬於 Forth 的過去式,它太複雜,不值得瞭解。在這
個時代,只要學會如何用 C 或是組合語言寫 Forth 就好。

燕南

unread,
Apr 26, 2009, 11:26:33 AM4/26/09
to 符式協會
<A> forth寫出(3x+1)=31 , forth自己會求出x的數值10.
這屬於 數值分析方面的問題
<B> 關於 數學方程式表示法 在 DOS 年代 有個 Math CAD
WinDows 有個專門為 DSP 做的 CAD,都比C更適合!
<C> 能做到 <--- 滿足需求 ( 自用可)
使用者認知方便 <--- 滿足需要 ( 他用&推廣)

松涛

unread,
Apr 27, 2009, 8:45:38 AM4/27/09
to 符式協會
恩。了解了。 燕南前辈的分析很明了。

亚斯的思维角度也很启发我。

燕南

unread,
May 7, 2009, 12:52:31 AM5/7/09
to 符式協會
建立 Forth 的方法
<a>如果 手頭已有 C語言編譯器(or other)則可以 直接用C寫 forth_kernel . ( 現成 MPU 有成熟的開發環境)
<b> 透過 Meta 寫 forth_kernel (沒有成熟的開發環境,但有一套適合forth時,Soc or 現成 MPU 都能做)
<c> 透過 c, 寫 forth_kernel or 重寫 Meta (沒有成熟的開發環境,但有一套不適合forth時,Soc or 現
成 MPU 都能做)
<d> 如果 是 自己做的Soc 又沒有forth的開發環境 , 就只有 從 機器碼 開始 (洪荒時代)

情況<a> 通常 在要做 "木馬屠城"時最好用, 在新公司 非forth環境下,可以排除 沒用過forth的程式員心防!

> > > 個時代,只要學會如何用 C 或是組合語言寫 Forth 就好。- 隱藏被引用文字 -
>
> - 顯示被引用文字 -

松涛

unread,
May 8, 2009, 1:11:47 AM5/8/09
to 符式協會
这个总结的特别详细和系统!受教了!

燕南

unread,
Jun 27, 2018, 12:52:56 PM6/27/18
to 符式協會

#反波蘭式

FLOAD 'D:\Forth\Libary\逆波蘭式\反波蘭式.f'

原 式: abc-(cef*dty+big)-girl+disk

反波蘭式: abc cef dty * big + - girl - disk +







松涛於 2009年4月22日星期三 UTC+8下午8時44分13秒寫道:
Reply all
Reply to author
Forward
0 new messages