【发布时间】:2009-10-10 13:06:22
【问题描述】:
我对最近question about GOTOs and tail recursion 的回答是用调用堆栈来表达的。我担心它不够通用,所以我问你:尾调用(或等价物)的概念在没有调用堆栈的架构中有何用处?
在继续传递中,所有被调用的函数都会替换调用函数,因此是尾调用,因此“尾调用”似乎没有什么有用的区别。在基于消息传递和事件的架构中,似乎没有等价物,但如果我错了,请纠正我。后两种架构是有趣的案例,因为它们与 OOP 而不是 FP 相关联。其他架构呢?旧的 Lisp 机器是基于调用堆栈的吗?
编辑:根据“What the heck is: Continuation Passing Style (CPS)”(以及下面的 Alex),在延续传递下尾调用的等价物不是“被调用函数替换调用函数”,而是“调用函数传递给定的延续,而不是创建新的延续”。与我所说的不同,这种尾调用很有用。
另外,我对在较低级别使用调用堆栈的系统不感兴趣,因为较高级别不需要调用堆栈。这个限制不适用于 Alex 的回答,因为他写的是其他调用架构 (is this the right term?) 通常有一个等效的调用堆栈,而不是他们在引擎盖下的某个地方有一个调用堆栈。在继续传递的情况下,结构类似于arborescence,但边缘方向相反。调用堆栈等价物与我的兴趣高度相关。
【问题讨论】:
标签: functional-programming callstack tail-call-optimization