将Lisp转换为C++

Ham*_*aya 8 c c++ scheme

我正在研究一种基于lisp(非常小的方案子集)编译成C++的玩具语言,我试图弄清楚如何表示let表达式,

(let ((var 10)
      (test 12))
  (+ 1 1)
  var)
Run Code Online (Sandbox Code Playgroud)

起初我认为执行所有exprs然后返回最后一个,但是返回会杀死我的嵌套let表达式的能力,那么表示let的方法是什么?

此外,任何关于源到源转换的资源都是适用的,我已经用Google搜索,但我所能得到的只是90分钟的方案编译器.

Gre*_*ill 9

扩展的一种方法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不同),因此需要额外的实现.