Есть ли способ реализации хвостовой рекурсии в Java? [Дубликат]

На основе обертки andrewdotn

Изменения:

  • Возвращает вывод stderr в stderr
  • Избегайте echo -e обработки содержимого в строках

wrapper

#!/bin/bash

"${@}" 2> >(
while read line; do
    echo -ne "\033[31m" 1>&2
    echo -n "${line}" 1>&2
    echo -e "\033[0m" 1>&2
done
)

Проблемы: выходные строки группируются, а не смешанные stdout / stderr

Тестовый скрипт:

#!/bin/bash

echo Hi
echo "\033[32mStuff"
echo message
echo error 1>&2
echo message
echo error 1>&2
echo message
echo error 1>&2

Выход:

Hi
\033[32mStuff
message
message
message
error # <- shows up red
error # <- shows up red
error # <- shows up red
11
задан Brian McCutchon 28 September 2017 в 07:18
поделиться

2 ответа

Насколько я знаю, Java 8 не имеет оптимизации хвостового вызова. Afaik это не связано с фактическим трюком компилятора, потому что это просто, но для сохранения вызова в целях безопасности. Но я предполагаю, что это возможно с перезаписью байт-кода.

10
ответ дан pveentjer 16 August 2018 в 02:31
поделиться

Java не поддерживает TCO на уровне компилятора, но его можно реализовать с помощью Java 8 с использованием лямбда-выражений. Он описывается Venkat Subramaniamin в «Функциональное программирование на Java».

5
ответ дан Olivier Meurice 16 August 2018 в 02:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: