# 練習 37:小型 BASIC
> 原文:[Exercise 37: Little BASIC](https://learncodethehardway.org/more-python-book/ex37.html)
> 譯者:[飛龍](https://github.com/wizardforcel)
> 協議:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻譯](https://translate.google.cn/)
你現在要及時回到我的童年,并實現一個 BASIC 解釋器。不,我這里的 BASIC 不是指“一個非常簡單的基本的解釋器”。我的意思是 BASIC 編程語言。它是最早的編程語言之一,最初由 John Kemeny 和 Thomas Kurtz 在 Dartmouth 創建。這個基本版本叫做 Dartmouth BASIC,[在 Dartmouth BASIC 維基百科頁面](https://en.wikipedia.org/wiki/Dartmouth_BASIC)上,代碼看起來像這樣:
```basic
5 LET S = 0
10 MAT INPUT V
20 LET N = NUM
30 IF N = 0 THEN 99
40 FOR I = 1 TO N
45 LET S = S + V(I)
50 NEXT I
60 PRINT S/N
70 GO TO 5
99 END
```
左邊的數字實際上是手動輸入的行號。你告訴 BASIC 每行一個數字,然后你可以只是告訴它“跳到”那一行來循環。后來在其他版本的 BASIC 中成為了`GOTO`,成為計算時代的象征。
BASIC 的最新版本,在 [BASIC 維基百科頁面](https://en.wikipedia.org/wiki/BASIC)上記載,該頁面記載了這個語言的漫長演化過程,朝著越來越現代的形式。過了一段時間,它吸收了 C 和 Algol 這樣的結構,然后它面向對象,今天你可以找到相當先進的 BASIC 版本。如果你想要現代的免費 BASIC,請查看 Gambas BASIC,網址為 <http://gambas.sourceforge.net/en/main.html>。
## 挑戰練習
你的挑戰是實現原始的 BASIC 解釋器 - 具有手動行號和所有 CAPS(大寫)文本樣式的解釋器。你需要查看 [BASIC 維基百科頁面](https://en.wikipedia.org/wiki/BASIC),來獲得可能的記號和示例代碼,并閱讀 [Dartmouth BASIC 維基百科頁面](https://learncodethehardway.org/more-python-book/https//en.wikipedia.org/wiki/Dartmouth_BASIC)來了解更多線索。你的解釋器應該能處理盡可能多的原始 BASIC 并產生有效的輸出。
當你嘗試這樣做時,我建議你嘗試簡單的數學運算,打印和跟蹤行號。之后,我會努力使`GOTO`正常工作。如果你完成它的話,你可以完成剩余部分,慢慢開發一套測試程序,來確保你的解釋器工作順利。
祝你好運!這可能花費你一段時間,但它應該很有趣。我可以看到自己花了幾個月的時間在這上面,添加愚蠢的功能,像圖形,所以我可以創建所有這些愚蠢的小程序,當我還是孩子的時候我編寫了它們。我寫了這么多 BASIC 代碼,計算行號絕對扭曲了我的大腦。這可能是我這么喜歡 Vim 的原因。
## 研究性學習
這個練習很困難,但如果你想要一些額外的挑戰,請執行以下操作:
+ 使用像 SLY 這樣的解析器生成器,創建一個替代的解釋器。一旦你有了 ABNF,這可能會變得更加容易,但是對于 BASIC 這樣的語言可能更難。你必須這樣做才能弄清楚。
+ 嘗試制作一個“結構化 BASIC”的版本,它擁有函數,循環,`if`語句,以及你可以在較舊的非 OOP 語言(如 C 或 Pascal)中找到的所有內容。這是一個巨大的任務,所以建議你嘗試不要手寫 RDP 解析器。使用像 SLY 這樣的工具生成你的解析器,并為更重要的東西節省你的腦力。
- 笨辦法學 Python · 續 中文版
- 引言
- 第一部分:預備知識
- 練習 0:起步
- 練習 1:流程
- 練習 2:創造力
- 練習 3:質量
- 第二部分:簡單的黑魔法
- 練習 4:處理命令行參數
- 練習 5:cat
- 練習 6:find
- 練習 7:grep
- 練習 8:cut
- 練習 9:sed
- 練習 10:sort
- 練習 11:uniq
- 練習 12:復習
- 第三部分:數據結構
- 練習 13:單鏈表
- 練習 14:雙鏈表
- 練習 15:棧和隊列
- 練習 16:冒泡、快速和歸并排序
- 練習 17:字典
- 練習 18:性能測量
- 練習 19:改善性能
- 練習 20:二叉搜索樹
- 練習 21:二分搜索
- 練習 22:后綴數組
- 練習 23:三叉搜索樹
- 練習 24:URL 快速路由
- 第四部分:進階項目
- 練習 25:xargs
- 練習 26:hexdump
- 練習 27:tr
- 練習 28:sh
- 練習 29:diff和patch
- 第五部分:文本解析
- 練習 30:有限狀態機
- 練習 31:正則表達式
- 練習 32:掃描器
- 練習 33:解析器
- 練習 34:分析器
- 練習 35:解釋器
- 練習 36:簡單的計算器
- 練習 37:小型 BASIC
- 第六部分:SQL 和對象關系映射
- 練習 38:SQL 簡介
- 練習 39:SQL 創建
- 練習 40:SQL 讀取
- 練習 41:SQL 更新
- 練習 42:SQL 刪除
- 練習 43:SQL 管理
- 練習 44:使用 Python 的數據庫 API
- 練習 45:創建 ORM
- 第七部分:大作業
- 練習 46:blog
- 練習 47:bc
- 練習 48:ed
- 練習 49:sed
- 練習 50:vi
- 練習 51:lessweb
- 練習 52:moreweb