Для оптимизации хвостовой рекурсии это должно быть преобразовано во что-то вроде следующего:
def retry[T](n: Int)(fn: => T): T = {
START:
try {
fn
} catch {
case e if n > 1 =>
n = n - 1
GOTO START
}
}
Когда он выполняет цикл GOTO
, он должен выйти в область действия блока catch
. Но в исходной рекурсивной версии выполнение рекурсивного вызова все еще находится в блоке catch
. Если язык допускает, что это может потенциально изменить смысл кода, то это не будет действительной оптимизацией.
РЕДАКТИРОВАТЬ: Из обсуждения с Рексом Керром в комментариях, это сохраняющее поведение преобразование в Scala (но только при отсутствии finally
). Очевидно, это просто то, что компилятор Scala еще не распознает, что последний вызов блока catch
, в котором нет finally
, находится в положении хвостового вызова.