2

我正在用纯 C 实现一个 Lisp 解释器,并且在从 C 转换到 Lisp 时遇到了麻烦。

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

我也实现了Paul Grahm描述的七个原语,并且理解了其中的元循环求值器。我的麻烦在于编写 C 代码的一部分(不是lisp!),一旦它被解析(“eval”)部分,它就会在上面显示的图像中实际执行数据结构。

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

我的问题是我是否需要在 C 中实现evaland apply(就像 Peter Norvig 在 Python 中所做的那样),或者是否有某种方法可以引导 lisp 解释器,其中evaland的唯一实现apply实际上是用 Lisp 编写的?

4

1 回答 1

2

如果您在 C 中制作解释器,则无法在 lisp 中实现evalapply。原因是您需要某种方式来解释解释器,并且您将遇到引导问题。

您可以通过数据驱动来使其最小化。例如,所有原始语法都有一个标签和一个接受表达式和环境的函数指针。基本上,符号quote可以评估为,你有 eval 调用函数。apply所有原始函数都有一个标签 + 函数指针,然后eval将要做的事情要少得多,并且更容易扩展。

你是对的,eval并且apply感觉就像 C 一样,因为这正是它的本质。哎呀,如果你看得够近的话,甚至我的脑残项目也会泄露一个元循环评估器。

于 2017-09-08T21:26:58.223 回答