Почему TCO требует поддержки от виртуальной машины?

Говорят, что некоторые виртуальные машины, особенно JVM, не поддерживают TCO. В результате такой язык, как Clojure, требует от пользователя использованияloop recur вместо.

Тем не менее, я могу переписать вызовы self-tail для использования цикла. Например, вот факториал хвостового вызова:

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

Это может сделать компилятор (и я написал макросы, которые делают это). Для взаимной рекурсии вы можете просто вставить функцию, которую вы вызываете.

Итак, учитывая, что вы можете реализовать TCO, не требуя ничего от виртуальной машины, почему языки (например, Clojure, Armed Bear Common Lisp) не делают этого? Что я пропустил?

Ответы на вопрос(3)

Ваш ответ на вопрос