типа, если рекурсивная функция вызвала себя тысячный раз - то выйти из рекурсии. как это в сях вообще делается то? я даж функций то никогда не писал... :(
Лямбда-редукция также итеративна. Есть функция f, есть даные g, нужно посчитать терм f g. Итеративно применяем бета-редукцию до тех пор, пока не получим финальный терм (кажется так называется терм, который нельзя редуцировать дальше). Этот терм и есть результат.
>Спорим я могу написать такой компилятор, что любой достаточно длинный цикл будет вываливаться по нехватке стека :-)
Опять проблема в тупом программисте, на этот раз авторе компилятора :)
>Есть очевидные и однозначные критерии, позволяющие определить, что вызов можно заменить безусловным переходом. Так почему же стоит считать _правильным_ компилятор, не делающий этого? Вот если процессор такую операцию не поддерживает - другое дело:-)
Правильно сказать - пока не получим выражение в НОРМАЛЬНОЙ ФОРМЕ.
От МТ сей процесс отличается тем, что порядок применение редукций недетерминирован, и не обязательно каждое преобразование будет приближать нас к НФ - к примеру, мы можем сначала всё в комбинАторную форму привести (e.g., если хотим компилять ленивый лямбда-язык).
>Правильно сказать - пока не получим выражение в НОРМАЛЬНОЙ ФОРМЕ.
Ага, именно так.
>От МТ сей процесс отличается тем, что порядок применение редукций недетерминирован,
Да, это так. Но если нормальная форма существует, то она единственна, а значит порядок роли не играет.
>и не обязательно каждое преобразование будет приближать нас к НФ - к примеру, мы можем сначала всё в комбинАторную форму привести (e.g., если хотим компилять ленивый лямбда-язык).
Да? Именно альфа-конверсией и бета-редукцией? Т.е без усложнения терма, единственные допустимые операции - альфа-конверсия и бета-редукция.
>Все нынешние компиляторы функциональных языков так и устроены. Простая редукция даже для эффективного интерпретатора не годится.
Ну, вопрос бы абстрактный.
>P.S. Нормальная форма существует ВСЕГДА. ;)
Не согласен.
(lamda (x) x x) (lambda (x) x x)
У этого терма нормальной формы нет (по крайней мере по тому определенюи нормальной формы, которое я знаю). Если я правильно понимаю, такие термы - это аналог зациклившейся машины Тьюринга.
Я обычно молчу во время таких научно-популярных дискусий, но тут решил высказаться. В книжках к тем курсам из которых ты почернул сведения про функцию Аккермана, чуть дальше доказывается вообще то равномощность оператора будем звать его просто -- while (в случае с языком C и for) и рекурсивных функций, такое вот дело, соответсвенно про неприведение к нерекуррентному виду это ты не по делу, так что не знаю что и думать про неимоверную глубину твоих знаний.