如何 bootstrap 使用 metacircular 求值器的 Lisp 解释器

How to bootstrap a Lisp interpreter using the metacircular evaluator

我正在用纯 C 实现 Lisp 解释器,但在从 C 转换到 Lisp 时遇到了问题。

按照 Peter Norvig 在他的 blog post 中的步骤,我有一个 REPL,它目前将 Lisp 表达式解析为 Lisp 数据结构,并将生成的数据结构序列化回 lisp 表达式,打印如下所示:

我还实现了 Paul Grahm 的七个原语 described,并了解其中的元循环求值器。我的麻烦出现在编写 C 代码部分(not lisp!),一旦数据结构被解析("eval"),图像中的部分就会实际执行以上。

根据我的理解,使用元循环求值器可以在 Lisp 本身中编写求值 Lisp 过程的语义。因此,我想将程序的这一部分保留在 lisp 中,但是,很明显,在某些时候我需要编写实际将原语或过程应用于 Lisp 数据结构的 C 代码。然而,当我开始编写这段代码时,我发现自己编写的逻辑与元循环求值器 itslef 相同,只是 C 版本。

我的问题是我是否需要在 C 中实现 evalapply(正如 Peter Norvig 在 Python 中所做的那样)或者是否有某种方法可以 bootstrap evalapply 的唯一实现实际上是用 Lisp 编写的 lisp 解释器?

如果你在用 C 编写解释器,则不可能在 lisp 中实现 evalapply。原因是你需要一些方法来解释解释器,你将有bootstrap 个问题。

您可以通过数据驱动使其最小化。例如,所有原始语法都有一个标记和一个采用表达式和环境的函数指针。基本上符号 quote 可以计算出那个并且你有 eval 调用函数。所有原始函数都有一个标记 + 函数指针,然后 applyeval 将少做很多事情并且更容易扩展。

你是对的,evalapply 感觉就像 C 中的一样,因为它就是这样。如果你看得够仔细的话,甚至我的 brainfuck project 也会泄露一个元循环求值器。