我正在使用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)会发生什么事情?我发现维基百科的定义有点模糊,也没有找到其他解释得好的内容。