我正在纯C中实现一个Lisp解释器,并且在从C转换到Lisp时遇到问题。
按照Peter Norvig在blog post中的步骤,我有一个REPL,它将Lisp表达式解析为Lisp数据结构,并将结果数据结构序列化为Lisp表达式,如下所示:
我还实现了Paul Grahm的七个原语described,并理解其中的元循环计算器我的问题出现在写C代码的部分(不是lisp!)在上面所示的图像中解析数据结构(“eval”)部分后,它实际上执行该数据结构。
根据我的理解,使用元循环求值器可以在Lisp本身中编写对Lisp过程求值的语义因此,我想把程序的这一部分留在lisp中,但是,很明显,在某些情况下,我需要编写C代码,将原语或过程实际应用于lisp数据结构然而,当我准备编写这段代码时,我发现自己编写的逻辑与元循环计算器itslef相同,只是c版本。
我的问题是,我是否需要在C中实现evalapply(就像Peter Norvig在Python中所做的那样),或者是否有某种方法可以引导lisp解释器,其中evalapply的唯一实现实际上是用lisp编写的?

最佳答案

如果用C语言编写解释器,就不可能在lisp中实现evalapply。原因是需要某种方法来解释解释器,并且会出现引导问题。
您可以通过数据驱动使其最小化所有的基本语法都有一个标记和一个函数指针,它接受表达式和环境基本上,符号quote可以计算到这个值,您可以调用eval函数所有基元函数都有一个tag+函数指针,然后applyeval就可以做得更少,更容易扩展。
你说得对,evalapply会感觉到和C相当,因为这正是它的本质如果你看得足够近的话,甚至我的brainfuck project也会泄露一个亚循环计算器。

07-25 22:27
查看更多