FORTH基础
?每次運(yùn)行DOSBox 0.74 ? 都要執(zhí)行一遍??Z:\>mount k d:\forth? ?, 然后 ? ? ? ? Z:\>K:(回車) ? ? ? ? K:\>cd pcforth(回車) ? ? ? ? K:\PCFORTH>forth(回車)
//筆記里面的return都表示輸入命令時(shí)候的換行 // '詞 '和 '數(shù)' 必須要用空格隔開,這樣FORTH才能識(shí)別,空格可以多個(gè),但是必須有
??( 前面的15 space少了s )
詞典:FORTH的每個(gè)詞和它的定義都被登記在FORTH詞典中。FORTH把自己定義翻譯成詞典形式寫入詞典條目。這個(gè)過(guò)程叫做 ?"編譯"? 終端鍵入命令詞,會(huì)啟動(dòng) ?INTERPRET ?的詞,叫做 ??“文本解釋程序";
FORTH 程序中: 也是一個(gè)詞;
命名:
少數(shù)不能用來(lái)命名的詞: return:回車符,表示完成輸入; backspace:刪除符,表示要修改; space:空格,作為一個(gè)詞的結(jié)束;注意: n SPACE 用完會(huì)在棧中插入好多1,所以不要用SPACE,要就使用 SPACES 用完還會(huì)把事先壓入棧中要求顯示的空格數(shù)彈出來(lái) ." ?:表示后面跟的是一個(gè)字符串; eg:??: GREET ?." ?HELLO , I SPEAK FORTH " ?; ? //這個(gè)標(biāo)記要組合出現(xiàn),不能空格隔開
堆棧:FORTH 運(yùn)算符的操作場(chǎng)所
后綴表示法:
FORTH 語(yǔ)言采用的是后綴表示法,不是中綴表示法;目的是便于使所有需要數(shù)字的詞能從堆棧中取得他們。 eg: ? ?+ ? ? ? ? ? ? ?從棧中彈出兩個(gè)數(shù)字并把他們相加; ??????? ? . ? ? ? ? ? ? ? 從棧中彈出一個(gè)數(shù)字并打印它尾隨一個(gè)空格; ???????? ?SPACES ? 從棧中彈出一個(gè)數(shù)字并打印相應(yīng)個(gè)數(shù)的空格; ???????? ?EMIT ? ??? ?從棧中彈出一個(gè)表示字符的數(shù)字并打印該字符; ?
記住堆棧的蹤跡:
"棧效應(yīng)"蹤跡就是指一個(gè)詞在執(zhí)行前棧中需要什么類型的數(shù)字,而執(zhí)行后它又將是什么類型的數(shù)字反壓回堆棧。 把自己定義的詞連同它們的意義逐步匯集成表,那么其他人和自己以后都能容易的理解這些詞的操作。 ?FORTH 中這種表稱為"詞匯表"; ?大家習(xí)慣在詞匯表中使用特定的 棧標(biāo)志法 。 (執(zhí)行前-執(zhí)行后) : 破折號(hào)是分隔符,前面的內(nèi)容表示執(zhí)行前當(dāng)處于棧頂?shù)膬?nèi)容,后面是執(zhí)行后壓入棧頂?shù)膬?nèi)容。 eg: ? . ? ?(n--) ? ? ? ? ? ? ? ? ? ? n表示一個(gè)數(shù),表示執(zhí)行前棧中要有一個(gè)數(shù),執(zhí)行后沒(méi)有數(shù)據(jù)要存入堆棧。 ? ? ? ? + (n1 n2 - sum) ? 表示 + 執(zhí)行前棧中要有兩個(gè)數(shù),執(zhí)行完后還有一個(gè)數(shù)壓入棧中。
一些術(shù)語(yǔ): 編譯(compile):由源文本生成計(jì)算機(jī)內(nèi)存中的詞典條目。 詞典(Dictionary): 在FORTH中,包括"系統(tǒng)"定義(預(yù)定義)和"用戶"定義(自己定義)的各種詞的一個(gè)表。詞典以編譯形式固存在計(jì)算機(jī)內(nèi)存。 執(zhí)行(Execute):運(yùn)行。所謂執(zhí)行一個(gè)詞就是完成該詞已編譯定義所指定的所有操作。 擴(kuò)展性(Extensibity):允許程序設(shè)計(jì)員加進(jìn)新的特性,或者對(duì)已具有特性的計(jì)算機(jī)語(yǔ)言的特點(diǎn)進(jìn)行修改。 詞匯表(Glossary):FORTH中已定義過(guò)的詞的表,標(biāo)明它們的棧功能和功能解釋,以供程序設(shè)計(jì)員參考。 輸入流(Input stream):由文本解釋程序讀入文本。它可以是你在終端剛剛鍵入的文本,也可以是存貯在磁盤上的文本。 解釋(Interpret):(當(dāng)相當(dāng)于FORTH的文本解釋程序時(shí))讀輸入流,然后到詞典中查對(duì)沒(méi)一個(gè)詞,若失敗,則轉(zhuǎn)換成數(shù)字。 后綴表示法(Postfix notation):把操作符書寫在他們的操作數(shù)字后邊的表示方法,如“2+5”寫成 “2 5 +”。也叫做 逆波蘭表示法(Reverse Polish Notation)。 堆棧(Stack):在FORTH中,數(shù)據(jù)按后進(jìn)先出方式能被存貯或移走的內(nèi)存區(qū)域。 堆棧上溢(Stack overflow):當(dāng)作為堆棧的內(nèi)存區(qū)域完全被數(shù)據(jù)充滿時(shí)所發(fā)生的錯(cuò)誤。 堆棧下溢(Stack underflow):當(dāng)操作符要求堆棧中數(shù)據(jù)但棧中已無(wú)合適的數(shù)據(jù)時(shí)所發(fā)生的錯(cuò)誤。 詞(Word):在FORTH中一個(gè)定義的名字。
以后的筆記中不再在要輸入回車符的地方打 return
//筆記里面的return都表示輸入命令時(shí)候的換行 // '詞 '和 '數(shù)' 必須要用空格隔開,這樣FORTH才能識(shí)別,空格可以多個(gè),但是必須有
| 15?SPACES return? | 打印15個(gè)空格 |
| 42 EMIT return? | 打印*,43是+;44,;45 -; |
| 15 SPACES 42 EMIT 42 EMIT return? | 組合命令,先打印15空格,然后再連續(xù)打印兩個(gè)* |
| : STAR 42 EMIT ; return | 自己定義詞組; : 表示定義,后面跟的是一個(gè)自己要定義的詞組的名稱;再后面的就是這個(gè)詞組要實(shí)現(xiàn)的功能;eg: STAR 命令實(shí)現(xiàn)輸出一個(gè)*號(hào) |
| CR STAR CR STAR CR STAR return | CR 是系統(tǒng)詞典,表示換行;后面跟的是剛才定義的命令 |
| : STARS 0 DO STAR LOOP ; return? | 定義單詞STARS,表示做循環(huán)次STAR,次數(shù)會(huì)在命令開頭給出 |
| 5 STARS return | 執(zhí)行5次STAR操作 |
| : MARGIN CR 30 SPACES ; return? | 定義,換行輸出30個(gè)空格 |
| : BLIP MARGIN STAR ; return? | 定義,換行輸出30個(gè)空格和一個(gè)*? |
| : BAR MARGIN 5 STARS ; return | 定義,換行輸出30個(gè)空格和5個(gè)*? |
| BAR BLIP BAR BLIP BLIP CR return | 輸出個(gè)F形狀 |
| : F BAR BLIP BAR BLIP BLIP CR ; return | 定義,輸出F |
詞典:FORTH的每個(gè)詞和它的定義都被登記在FORTH詞典中。FORTH把自己定義翻譯成詞典形式寫入詞典條目。這個(gè)過(guò)程叫做 ?"編譯"? 終端鍵入命令詞,會(huì)啟動(dòng) ?INTERPRET ?的詞,叫做 ??“文本解釋程序";
FORTH 程序中: 也是一個(gè)詞;
命名:
少數(shù)不能用來(lái)命名的詞: return:回車符,表示完成輸入; backspace:刪除符,表示要修改; space:空格,作為一個(gè)詞的結(jié)束;注意: n SPACE 用完會(huì)在棧中插入好多1,所以不要用SPACE,要就使用 SPACES 用完還會(huì)把事先壓入棧中要求顯示的空格數(shù)彈出來(lái) ." ?:表示后面跟的是一個(gè)字符串; eg:??: GREET ?." ?HELLO , I SPEAK FORTH " ?; ? //這個(gè)標(biāo)記要組合出現(xiàn),不能空格隔開
堆棧:FORTH 運(yùn)算符的操作場(chǎng)所
后綴表示法:
FORTH 語(yǔ)言采用的是后綴表示法,不是中綴表示法;目的是便于使所有需要數(shù)字的詞能從堆棧中取得他們。 eg: ? ?+ ? ? ? ? ? ? ?從棧中彈出兩個(gè)數(shù)字并把他們相加; ??????? ? . ? ? ? ? ? ? ? 從棧中彈出一個(gè)數(shù)字并打印它尾隨一個(gè)空格; ???????? ?SPACES ? 從棧中彈出一個(gè)數(shù)字并打印相應(yīng)個(gè)數(shù)的空格; ???????? ?EMIT ? ??? ?從棧中彈出一個(gè)表示字符的數(shù)字并打印該字符; ?
| 定義一個(gè)總是把4和堆棧中的任意數(shù)相加的詞 | : FOUR-MORE 4 + ; return |
| 3 FOUR-MORE . return? -10 FOUR-MORE . return | |
| 在這種情況下,定義內(nèi)部的“4”就仿佛它在定義外邊一樣被壓棧。然后 + 將棧中的兩個(gè)數(shù)字相加。 | 因?yàn)?+ 總是對(duì)棧中的數(shù)字進(jìn)行操作,所以它并不關(guān)心 “4” 是來(lái)自定義內(nèi)部的 3 還是來(lái)自定義外部的。 |
記住堆棧的蹤跡:
"棧效應(yīng)"蹤跡就是指一個(gè)詞在執(zhí)行前棧中需要什么類型的數(shù)字,而執(zhí)行后它又將是什么類型的數(shù)字反壓回堆棧。 把自己定義的詞連同它們的意義逐步匯集成表,那么其他人和自己以后都能容易的理解這些詞的操作。 ?FORTH 中這種表稱為"詞匯表"; ?大家習(xí)慣在詞匯表中使用特定的 棧標(biāo)志法 。 (執(zhí)行前-執(zhí)行后) : 破折號(hào)是分隔符,前面的內(nèi)容表示執(zhí)行前當(dāng)處于棧頂?shù)膬?nèi)容,后面是執(zhí)行后壓入棧頂?shù)膬?nèi)容。 eg: ? . ? ?(n--) ? ? ? ? ? ? ? ? ? ? n表示一個(gè)數(shù),表示執(zhí)行前棧中要有一個(gè)數(shù),執(zhí)行后沒(méi)有數(shù)據(jù)要存入堆棧。 ? ? ? ? + (n1 n2 - sum) ? 表示 + 執(zhí)行前棧中要有兩個(gè)數(shù),執(zhí)行完后還有一個(gè)數(shù)壓入棧中。
一些術(shù)語(yǔ): 編譯(compile):由源文本生成計(jì)算機(jī)內(nèi)存中的詞典條目。 詞典(Dictionary): 在FORTH中,包括"系統(tǒng)"定義(預(yù)定義)和"用戶"定義(自己定義)的各種詞的一個(gè)表。詞典以編譯形式固存在計(jì)算機(jī)內(nèi)存。 執(zhí)行(Execute):運(yùn)行。所謂執(zhí)行一個(gè)詞就是完成該詞已編譯定義所指定的所有操作。 擴(kuò)展性(Extensibity):允許程序設(shè)計(jì)員加進(jìn)新的特性,或者對(duì)已具有特性的計(jì)算機(jī)語(yǔ)言的特點(diǎn)進(jìn)行修改。 詞匯表(Glossary):FORTH中已定義過(guò)的詞的表,標(biāo)明它們的棧功能和功能解釋,以供程序設(shè)計(jì)員參考。 輸入流(Input stream):由文本解釋程序讀入文本。它可以是你在終端剛剛鍵入的文本,也可以是存貯在磁盤上的文本。 解釋(Interpret):(當(dāng)相當(dāng)于FORTH的文本解釋程序時(shí))讀輸入流,然后到詞典中查對(duì)沒(méi)一個(gè)詞,若失敗,則轉(zhuǎn)換成數(shù)字。 后綴表示法(Postfix notation):把操作符書寫在他們的操作數(shù)字后邊的表示方法,如“2+5”寫成 “2 5 +”。也叫做 逆波蘭表示法(Reverse Polish Notation)。 堆棧(Stack):在FORTH中,數(shù)據(jù)按后進(jìn)先出方式能被存貯或移走的內(nèi)存區(qū)域。 堆棧上溢(Stack overflow):當(dāng)作為堆棧的內(nèi)存區(qū)域完全被數(shù)據(jù)充滿時(shí)所發(fā)生的錯(cuò)誤。 堆棧下溢(Stack underflow):當(dāng)操作符要求堆棧中數(shù)據(jù)但棧中已無(wú)合適的數(shù)據(jù)時(shí)所發(fā)生的錯(cuò)誤。 詞(Word):在FORTH中一個(gè)定義的名字。
以后的筆記中不再在要輸入回車符的地方打 return
轉(zhuǎn)載于:https://www.cnblogs.com/meihao1203/p/6771478.html
總結(jié)
- 上一篇: 道法演讲之马云从事教育
- 下一篇: php收银系统如何连接pos机,收银po