我想要实现一个Scheme解释器以便学习SICP。

9
我正在阅读书籍《计算机程序的构造和解释》,希望逐步编写一个Scheme解释器。 你知道哪种Scheme实现方式最易于阅读(且代码量最短)吗? 我将使用JavaScript在C中实现。

1
读完SICP后,我觉得你会从用Scheme(或其他Lisp方言 - 我喜欢Clojure)编写解释器并完成一些练习中获得更多的收获,而不是用C编写解释器。 - mwd
3
你读完SICP的进度如何?在阅读第4和5章的过程中,你将编写一个(实际上不止一个)Scheme解释器和编译器。如果你完成了这本书,你就会找到你寻求的东西:元循环解释器(Scheme in Scheme)非常简洁。 - okonomichiyaki
7个回答

8

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


5

4

Christian Queinnec的书《Lisp In Small Pieces》非常出色。比EoPL更现代化。涵盖了Lisp和Scheme,并详细介绍了大多数书籍遗漏的令人毛骨悚然的低级内容。


它也不太适合初学者。 - leppie

2
我建议阅读肯特·戴维格的论文 "Scheme的三种实现模型". 不需要阅读整篇论文,但是第一部分 (直到第3章) 中他讨论堆模型非常适合Scheme的初学者实现。
另一个很棒的资源(如果我理解正确,而且你想在C中实现它)是Nils Holm的“Scheme 9 from Empty Space”(《空空如也的第九方案》)。这个链接是指向Nils的页面,页面底部有一个链接,可以链接到旧版公共领域书籍和新版易读商业版。我阅读了两个版本并喜欢它们。

1

我曾经也有过类似的任务,但是几年后了,我的建议是:

我仍在搜索有关创建Lisp/Scheme虚拟机的好博客文章,这个虚拟机可以与JIT相结合(对于任何竞争性的JS实现非常重要 :)。


1

我可以给你一个关于我的解释器如何工作的概述,也许它可以给你一个大致的想法。虽然答案有点晚了,但我希望这可以帮助到其他来到这个线程并想要一个概括性想法的人。

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

a) Define_Evaluator:用于定义语句

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

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

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

e) Eval_Evaluator:执行表达式的实际处理。

3.-> 首先使用Read Evaluator读取每个表达式,它将从表达式中创建一个Scheme对象。递归计算嵌套表达式,直到表达式完成。

->接下来,Eval_Evaluator被触发,处理在第一步形成的Scheme Expression Object。 过程如下:

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

b) 如果要评估的表达式是列表。打印该列表。

c) 如果要评估的表达式是函数。查找函数的定义,该定义将使用Funcall_Evaluator返回评估结果。

->最后,启动打印评估器以打印结果,此打印取决于输出表达式的类型。

免责声明:这是我的解释器工作方式,不必是这样。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接