我试图弄清楚如何实现 Lisp 评估 non-recursive。我的基于 C 的评估器是Minimal Lisp文件 l1.c。然而,那里的几个函数再次递归到 eval:eval、apply、evargs、evlist 以及 Lisp Ops defineFunc、whileFunc、setqFunc、ifFunc...
我试图找出一个平的评价。我可以想出一些可能的方法:
- 转换为字节码并在 VM 中执行
- 实现一个扁平的 Forth 求值器并在 Forth 中实现 Lisp 求值,这就是lf.f所做的。
- 另一种可能性可能是将 l1.c 中的所有递归函数加入一个大的 switch 循环中。局部变量将连接到基于堆的结构中,对递归子函数的调用将由基于堆的返回堆栈实现。
我的问题是:是否存在以不同方式进行平面评估的算法/论文/实现。我正在寻找一种不转换为字节码但类似于使用下推堆栈的无递归“深度优先遍历”的实现。我想对原始的 s 表达式进行操作。
答:在 c 中实现评估器时,您需要在一个平面循环中实现整个事物,手动实现返回堆栈和堆栈帧,使用 goto 和 switch() 对控制流进行建模。这是一个例子:flat。