9

我正在阅读Structure and Interpretation of Computer Programs一书,我想逐渐编写一个方案解释器。

你知道最容易阅读(而且简短)的方案的实现吗?我将用 C 编写一个 JavaScript。

4

7 回答 7

8

SICP 本身有几个部分详细介绍了如何构建元循环解释器,但我建议您查看以下两本书以获得有关 Scheme 解释器的更好资源:编程语言:应用程序和解释以及编程语言基础。它们既易于阅读,又可以逐步指导您构建解释器。

于 2011-09-23T20:46:22.847 回答
5

我会推荐从头开始的博客系列 Scheme,它在 C 中逐步构建了一个方案解释器。

于 2011-11-27T05:48:30.813 回答
4

Christian Queinnec 的书 Lisp In Small Pieces 非常棒。比 EoPL 更现代。涵盖了 Lisp 和 Scheme,并详细介绍了大多数书籍都忽略的血腥低级内容。

于 2011-09-23T21:15:51.747 回答
2

我建议阅读 Kent Dybvig 的论文“ Scheme 的三种实现模型”。不是整篇论文,而是他讨论基于堆的模型的第一部分(直到第 3 章)非常适合于 Scheme 的简单实现。

另一个很好的资源(如果我理解正确并且您想用 C 实现它)是Nils Holm 的“来自空白空间的方案 9”。此链接指向 Nils 的页面,底部有一个链接,指向该书的旧版公共领域版本和新的、更易于阅读的商业版。阅读并喜欢它们。

于 2011-10-17T20:38:10.683 回答
1

我可以概述一下我的解释器是如何工作的,也许它可以让你大致了解一下。 虽然答案很晚,但我希望这可以帮助其他人,他们来到这个线程并想要一个一般的想法。

  1. 对于输入的每一行方案,都会创建一个 Command 对象。如果命令是部分命令,则存储其嵌套级别(完成表达式的剩余右括号数)。如果命令完成,则会创建一个表达式对象,并在此对象上触发评估器。
  2. 定义了 4 种类型的求值器类,每一种都派生自基类 Evaluator

a)Define_Evaluator:用于定义语句

b) Funcall_Evaluator :用于处理其他用户定义的函数

c) Read_Evaluator:用于读取表达式并将其转换为方案对象

d) Print_Evaluator:根据对象的类型打印对象。

e) Eval_Evaluator :对表达式进行实际处理。

3.->首先使用读取评估器读取每个表达式,该评估器将从表达式中创建一个方案对象。递归计算嵌套表达式,直到表达式完成。

-> 接下来,触发 Eval_Evaluator 处理第一步中形成的方案表达式对象。就这样发生了

a) 如果要计算的表达式是一个符号。返回它的值。因此,变量blk将返回该块的对象。

b) 如果要计算的表达式是一个列表。打印列表。

c) 如果要计算的表达式是一个函数。查找将使用 Funcall_Evaluator 返回评估的函数的定义。

->最后打印评估器被触发以打印结果,这个打印将取决于输出表达式的类型。

免责声明: 这就是我的口译员的工作方式,不必如此。

于 2012-06-18T14:28:20.853 回答
1

我一直在执行类似的任务,但几年后,建议:

我仍在寻找有关创建 lisp/scheme VM 的优秀博客文章,它可以与 JIT 结合使用(对于任何有竞争力的 JS 实现都很重要:)。

于 2013-10-25T17:23:36.767 回答
0

除了Queinnec 的书,这可能是方案到 C 转换中最全面的一本书,您还可以阅读旧平台library.readscheme.org的文献。

于 2020-01-28T17:25:30.090 回答