Нет почти никакой причины , а не , чтобы использовать recur
, если у вас есть хвостовой рекурсивный метод, хотя, если вы не находитесь в области кода, чувствительной к производительности, это просто не даст никаких результатов.Разница.
Я думаю, что основной аргумент состоит в том, что наличие recur
явного делает очень ясным, является ли функция хвостовой рекурсивной или нет;все хвостовые рекурсивные функции используют recur
, и все функции, которые recur
являются хвостовыми рекурсивными (компилятор будет жаловаться, если вы попытаетесь использовать recur
из не-хвостовой позиции.) Так что это немного эстетичнорешение.
recur
также помогает отличить Clojure от языков, которые будут выполнять TCO при всех вызовах хвоста, таких как Scheme;Clojure не может сделать это эффективно, потому что его функции скомпилированы как функции Java, а JVM не поддерживает его.Делая recur
особым случаем, мы надеемся, что нет завышенных ожиданий.
Я не думаю, что была бы какая-либо техническая причина, по которой компилятор не мог бы вставить recur
для вас, если бы он был спроектирован так, чтобыКстати, но, может быть, кто-то меня поправит.