重复的有限程度如何?

vem*_*emv 5 recursion clojure tail-call-optimization

据我所知,Clojure recur是由编译器支持的,而在其他lisps中它是在较低级别实现的.

在我读到的时候,这不是一般的"TCO".除了显而易见的(需要一个关键字+检查),它在recur哪些方面不那么强大?

iva*_*ant 2

recur只支持尾递归优化,它是通用TCO的子类。Clojure 还支持通过 相互或间接递归trampoline

编辑 另外,我认为一般 TCO 预计将与 Java 7 一起登陆 JVM,并且recur是一个临时解决方案。然后甲骨文发生了。我将其与 Lambda 项目(在 Java 中添加闭包)的时间表混合在一起

  • @vemv,不。Trampolining 的存在是为了处理 TCO 的另一种常见情况(但不如直接递归),但 TCO 比这更普遍。从概念上讲,它实际上很简单:它说的是,如果函数 A 调用函数 B,然后它所做的就是将 B 的结果返回给 A 的调用者,它可以只是“跳转”到 B 而不是“调用” B,B 将直接返回给 A 的调用者。尾递归是相同的优化,但仅限于 A 调用自身时。 (2认同)
  • (续)使用蹦床,您可以调用“trampoline”并指示它调用函数 A。A 返回到“trampoline”并指示调用 B。然后 B 可以指示“trampoline”调用 A 或其他函数。因此,间接调用者(A,B)被从堆栈中删除,只有“trampoline”保留在那里。它确实有效,但需要所有参与者的合作,因此它不像一般的 TCO 那样通用和优雅。 (2认同)