# 练习 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