如何使用metacircular评估器

时间:2017-09-07 05:51:44

标签: c lisp interpreter metacircular

我在纯C中实现了一个Lisp解释器,并且无法从C转换为Lisp。

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

我还实施了Paul Grahm的七个原语described,并了解其中的元外评估者。我写的部分C代码( not lisp!)出现了麻烦,它实际上是在解析后的数据结构(上面显示的图像中的“eval”)部分执行的。

根据我的理解,使用metacircular评估器可以编写在Lisp本身中评估Lisp过程的语义。因此,我想将这部分程序留在lisp中,但是,在某些时候我需要编写实际上将原语或过程应用于Lisp数据结构的C代码。然而,当我去编写这段代码时,我发现自己编写了与metacircular评估器itslef相同的逻辑,只是C版本。

我的问题是我是否需要在C中实现evalapply(如Peter Norvig在Python中所做的那样),或者是否有某种方法来引导lisp解释器,其中{{1}的唯一实现1}}和eval实际上是用Lisp编写的吗?

1 个答案:

答案 0 :(得分:1)

如果要在C语言中编写解释器,则无法在lisp中实现evalapply。原因是您需要一些方法来解释解释器并且您将有一个引导程序问题。

您可以通过数据驱动将其降至最低。例如,所有原始语法都有一个标记和一个表达式和环境的函数指针。基本上,符号quote可以对此进行评估,并且您已经eval调用该函数。所有原始函数都有一个标记+函数指针,然后applyeval将要做的更少,更容易扩展。

你是对的,evalapply会觉得C等价相同,因为它正是它的本质。如果你看得足够近,甚至我的brainfuck project泄漏了一个元气流评估员。