SICP本身有几个部分详细介绍了如何构建元循环解释器,但我建议您查看以下两本书,以获取更好的Scheme解释器资源:编程语言:应用与解释和编程语言基础。它们都易于阅读,并逐步指导您构建解释器。
Christian Queinnec的书《Lisp In Small Pieces》非常出色。比EoPL更现代化。涵盖了Lisp和Scheme,并详细介绍了大多数书籍遗漏的令人毛骨悚然的低级内容。
我曾经也有过类似的任务,但是几年后了,我的建议是:
我仍在搜索有关创建Lisp/Scheme虚拟机的好博客文章,这个虚拟机可以与JIT相结合(对于任何竞争性的JS实现非常重要 :)。
我可以给你一个关于我的解释器如何工作的概述,也许它可以给你一个大致的想法。虽然答案有点晚了,但我希望这可以帮助到其他来到这个线程并想要一个概括性想法的人。
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返回评估结果。
->最后,启动打印评估器以打印结果,此打印取决于输出表达式的类型。
免责声明:这是我的解释器工作方式,不必是这样。