1
0
mirror of https://github.com/apachecn/lmpythw-zh.git synced 2025-05-28 12:02:19 +00:00
lmpythw-zh/ex37.md
wizardforcel ba101d5ce7 ex37
2017-08-14 11:58:01 +08:00

44 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 练习 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 这样的工具生成你的解析器,并为更重要的东西节省你的脑力。