我正在阅读Structure and Interpretation of Computer Programs一书,我想逐渐编写一个方案解释器。
你知道最容易阅读(而且简短)的方案的实现吗?我将用 C 编写一个 JavaScript。
我正在阅读Structure and Interpretation of Computer Programs一书,我想逐渐编写一个方案解释器。
你知道最容易阅读(而且简短)的方案的实现吗?我将用 C 编写一个 JavaScript。
SICP 本身有几个部分详细介绍了如何构建元循环解释器,但我建议您查看以下两本书以获得有关 Scheme 解释器的更好资源:编程语言:应用程序和解释以及编程语言基础。它们既易于阅读,又可以逐步指导您构建解释器。
我会推荐从头开始的博客系列 Scheme,它在 C 中逐步构建了一个方案解释器。
Christian Queinnec 的书 Lisp In Small Pieces 非常棒。比 EoPL 更现代。涵盖了 Lisp 和 Scheme,并详细介绍了大多数书籍都忽略的血腥低级内容。
我建议阅读 Kent Dybvig 的论文“ Scheme 的三种实现模型”。不是整篇论文,而是他讨论基于堆的模型的第一部分(直到第 3 章)非常适合于 Scheme 的简单实现。
另一个很好的资源(如果我理解正确并且您想用 C 实现它)是Nils Holm 的“来自空白空间的方案 9”。此链接指向 Nils 的页面,底部有一个链接,指向该书的旧版公共领域版本和新的、更易于阅读的商业版。阅读并喜欢它们。
我可以概述一下我的解释器是如何工作的,也许它可以让你大致了解一下。 虽然答案很晚,但我希望这可以帮助其他人,他们来到这个线程并想要一个一般的想法。
a)Define_Evaluator:用于定义语句
b) Funcall_Evaluator :用于处理其他用户定义的函数
c) Read_Evaluator:用于读取表达式并将其转换为方案对象
d) Print_Evaluator:根据对象的类型打印对象。
e) Eval_Evaluator :对表达式进行实际处理。
3.->首先使用读取评估器读取每个表达式,该评估器将从表达式中创建一个方案对象。递归计算嵌套表达式,直到表达式完成。
-> 接下来,触发 Eval_Evaluator 处理第一步中形成的方案表达式对象。就这样发生了
a) 如果要计算的表达式是一个符号。返回它的值。因此,变量blk将返回该块的对象。
b) 如果要计算的表达式是一个列表。打印列表。
c) 如果要计算的表达式是一个函数。查找将使用 Funcall_Evaluator 返回评估的函数的定义。
->最后打印评估器被触发以打印结果,这个打印将取决于输出表达式的类型。
免责声明: 这就是我的口译员的工作方式,不必如此。
我一直在执行类似的任务,但几年后,建议:
我仍在寻找有关创建 lisp/scheme VM 的优秀博客文章,它可以与 JIT 结合使用(对于任何有竞争力的 JS 实现都很重要:)。
除了Queinnec 的书,这可能是方案到 C 转换中最全面的一本书,您还可以阅读旧平台library.readscheme.org的文献。