c - 如何使用元循环求值器引导 Lisp 解释器

标签 c lisp interpreter metacircular

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

跟随 Peter Norvig 的脚步 blog post ,到目前为止,我有一个 REPL,它将 Lisp 表达式解析为 Lisp 数据结构,并将结果数据结构序列化回打印的 lisp 表达式,如下所示:

我还实现了七个原语 described作者:Paul Grahm,并了解其中的元循环评估器。我在编写 C 代码部分(不是 lisp!)时遇到了麻烦,该部分在解析完数据结构(“eval”)后实际执行上图中所示的部分。

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

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

最佳答案

如果你用 C 创建解释器,则不可能在 lisp 中实现 evalapply 。原因是你需要某种方法来解释解释器你将会遇到 Bootstrap 问题。

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

你是对的,evalapply 感觉就像 C 语言中的等价物,因为这正是它的本质。哎呀,连我的brainfuck project如果你观察得足够近的话,就会泄漏元圆评估器。

关于c - 如何使用元循环求值器引导 Lisp 解释器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46088747/

相关文章:

c# - 阅读 C++ 代码 Create_Frame 函数(从 C# 的角度)

c - 为什么这些构造使用增量前和增量后未定义的行为?

lisp - Common Lisp - 符号计算的简单介绍 : Excercise 4. 4

lisp - AutoLISP:删除列表中的连续重复项

python解释器命令输入

javascript - 如何为 while 循环构建正则表达式?

c - 运行时检查失败 #2 - 变量 'thread no' 周围的堆栈已损坏

c - 在循环中,读取的不同字符串最终会被重复为同一字符串

lisp - 如何使用定义中的参数在 Lisp 中定义结构

java - 如何从 Java 调用 Haskell