Warum benötigt TCO Unterstützung von der VM?
Einige VMs, insbesondere die JVM, unterstützen angeblich keine TCO. Aus diesem Grund muss der Benutzer eine Sprache wie Clojure verwendenloop
recur
stattdessen.
Ich kann jedoch Self-Tail-Aufrufe umschreiben, um eine Schleife zu verwenden. Hier ist zum Beispiel ein Tail-Call-Faktor:
def factorial(x, accum):
if x == 1:
return accum
else:
return factorial(x - 1, accum * x)
Hier ist ein Schleifenäquivalent:
def factorial(x, accum):
while True:
if x == 1:
return accum
else:
x = x - 1
accum = accum * x
Dies könnte von einem Compiler gemacht werden (und ich habe Makros geschrieben, die dies tun). Für die gegenseitige Rekursion können Sie einfach die aufgerufene Funktion einbinden.
Wenn Sie also TCO implementieren können, ohne etwas von der VM zu benötigen, warum tun dies dann keine Sprachen (z. B. Clojure, Armed Bear Common Lisp)? Was habe ich vermisst?