Говорят, что некоторые виртуальные машины, в первую очередь JVM, не поддерживают совокупную стоимость владения. В результате такой язык, как 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
Это может быть сделано компилятором (и я написал макросы, которые делают это). Для взаимной рекурсии вы можете просто встроить вызываемую функцию.
Итак, учитывая, что вы можете реализовать совокупную стоимость владения, не требуя ничего от виртуальной машины, почему языки (например, Clojure, Armed Bear Common Lisp) не делают этого? Что я пропустил?
defn
. - person Thumbnail   schedule 20.04.2014