我正在根据 Wikipedia 上的描述用 C#编写SECD 机器的模拟器。我已经完成了基本操作,但我不确定如何执行指令。rap
在维基百科它说rap
:
rap 和 ap 一样工作,只是它用当前环境替换了一个虚拟环境的出现,从而使递归函数成为可能
它说ap
:
ap 从堆栈中弹出一个闭包和参数值列表。闭包通过将其环境安装为当前环境,将参数列表推到其前面,清除堆栈并将 C 设置为闭包的函数指针来应用于参数。S、E 的前一个值和 C 的下一个值保存在转储中。
这是我的实现ap
public void ap()
{
Push(S, ref D);
Push(E, ref D);
Push(C, ref D);
List closure = Pop(ref S);
List paramlist = Pop(ref S);
E = closure.Tail;
Push(paramlist, ref E);
C = closure.Head;
S = List.Nil;
}
请注意,这List
是我对 Lisp 样式“cons”单元格的实现。
让我感到困惑的是究竟有什么rap
不同ap
?例如,环境寄存器 (E) 究竟发生了什么?我发现 Wikipedia 的定义有点模棱两可,并且找不到任何其他可以很好地解释它的东西。