有些虚拟机,尤其是 JVM,据说不支持 TCO。因此,像 Clojure 这样的语言需要用户使用loop
recur
。
但是,我可以重写自尾调用以使用循环。例如,这是一个尾调用阶乘:
def factorial(x, accum):
if x == 1:
return accum
else:
return factorial(x - 1, accum * x)
这是一个等效的循环:
def factorial(x, accum):
while True:
if x == 1:
return accum
else:
x = x - 1
accum = accum * x
这可以由编译器完成(我已经编写了执行此操作的宏)。对于相互递归,您可以简单地内联您正在调用的函数。
那么,既然您可以在不需要任何 VM 的情况下实现 TCO,为什么语言(例如 Clojure、Armed Bear Common Lisp)不这样做呢?我错过了什么?