一部の VM、特に 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 など) でこれを行わないのでしょうか? 私は何を逃したのですか?