【发布时间】:2011-08-24 13:41:44
【问题描述】:
我正在制作我自己的类似 Lisp 的解释语言,并且我想做尾调用优化。我想将我的解释器从 C 堆栈中解放出来,这样我就可以管理我自己从函数到函数的跳转以及我自己的堆栈魔法来实现 TCO。 (我真的不是说堆栈本身,只是调用不会将帧添加到 C 堆栈的事实。我想使用我自己的堆栈,它不会随着尾调用而增长)。像 Stackless Python 一样,不像 Ruby 或……我猜是标准 Python。
但是,由于我的语言是 Lisp 派生的,目前对 s 表达式的所有计算都是递归完成的(因为这是我想到的最明显的方式来完成这个非线性、高度分层的过程)。我有一个 eval 函数,每次遇到函数调用时都会调用 Lambda::apply 函数。 apply 函数然后调用 eval 来执行函数体,以此类推。相互渴望堆栈的非尾 C 递归。我目前使用的唯一迭代部分是评估一组连续的 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,也许?我真的不知道。请多多包涵,我主要是自学(互联网)编程。
【问题讨论】:
标签: recursion lisp stack stack-overflow interpreter