我正在研究一种基于lisp(非常小的方案子集)编译成C++的玩具语言,我试图弄清楚如何表示let表达式,
(let ((var 10)
(test 12))
(+ 1 1)
var)
Run Code Online (Sandbox Code Playgroud)
起初我认为执行所有exprs然后返回最后一个,但是返回会杀死我的嵌套let表达式的能力,那么表示let的方法是什么?
此外,任何关于源到源转换的资源都是适用的,我已经用Google搜索,但我所能得到的只是90分钟的方案编译器.
扩展的一种方法let是将其视为lambda:
((lambda (var test) (+ 1 1) var) 10 12)
Run Code Online (Sandbox Code Playgroud)
然后,将其转换为C++中的函数和相应的调用:
int lambda_1(int var, int test) {
1 + 1;
return var;
}
lambda_1(10, 12);
Run Code Online (Sandbox Code Playgroud)
所以在更大的背景下:
(display (let ((var 10)
(test 12))
(+ 1 1)
var))
Run Code Online (Sandbox Code Playgroud)
变
display(lambda_1(10, 12));
Run Code Online (Sandbox Code Playgroud)
还有很多细节,比如需要访问letfrom 之外的词法变量let.由于C++没有词法嵌套函数(例如,与Pascal不同),因此需要额外的实现.