然而,由于我的语言是 Lisp 的衍生物,所有 s 表达式的评估目前都是递归完成的(因为这是我想到的最明显的方法来处理这个非线性、高度分层的过程)。我有一个 eval 函数,每次遇到函数调用时都会调用 Lambda::apply 函数。然后 apply 函数调用 eval 来执行函数体等操作。相互递归的堆栈消耗非常大。我目前唯一使用的迭代部分是对连续 s 表达式的求值。
(defun f (x y)
(a x y)) ; tail call! goto instead of call.
; (do not grow the stack, keep return addr)
(defun a (x y)
(+ x y))
; ...
(print (f 1 2)) ; how does the return work here? how does it know it's supposed to
; return the value here to be used by print, and how does it know
; how to continue execution here??
那么,我如何避免使用C递归呢?或者我可以使用某种跳转到C函数的goto吗?也许是longjmp吗?我真的不知道。请耐心等待,我大部分是自学编程(通过互联网)。