Rebol尾调用优化

7
我来自函数式编程的背景,对解决问题首先考虑递归方案,而非迭代方案。我开始使用Rebol(具体是R3)并编写了一个使用尾递归函数和累加器解决素数分解 kata 的方案。但是,对于足够大的输入,我会爆栈。我有一个名为“tail-func.r”的Rebol2脚本,它实现了尾调用优化的版本,据我所知,它还没有移植到R3。我知道在许多情况下,Rebol 3与R2的实现方式不同,因此是否有一种方法可以在没有任何额外代码的情况下获得R3中的TCO?如果没有,是否有更简单的方法可以获得它,而无需移植旧脚本?
编辑后添加我的代码:
primefactors: function [n m factors] [
  either n > 1
    [ either (modulo n m) == 0
      [ primefactors (n / m) m (append factors m) ]
      [ primefactors n (m + 1) factors ] ]
    [ factors ]
  ]

  primefactors 30 2 (copy []) => [2 3 5]

你能提供一个简单的代码片段作为示例吗? - johnk
当然,我已经添加了我的样本质因数实现。 - Jamie
1个回答

3
抱歉,没有代码是不可能的。Rebol没有编译,所以无法提前知道哪些内容构成了尾调用。即使对于return函数的调用,也会快速但不会通过goto回溯到调用堆栈中。
如果我没记错,tail-func的作者现在正在开发Rebol 3,并且很容易移植过去。既然你提到了这个,我会去看看的。在Rebol中,函数生成器和预处理器很容易实现。

啊,那未编译的部分就有意义了。我习惯于实现至少执行一次代码优化遍历,然后解释中间结果(或继续生成机器代码)。 - Jamie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接