Как стать автором
Обновить

Комментарии 9

И с учётом того, что тинисхема нигде не обещает, что она имеет оптимизацию хвостовой рекурсии, постоянно использовать рекурсивные решения, это опрометчивый шаг.

Любая реализация Scheme обязана иметь оптимизацию хвостовой рекурсии. Более того, do - это макрос, реализуемый через рекурсивный вызов letrec, в чём можно убедиться, если есть возможность посмотреть код порождаемой им лямбды.

В этом отношении язык Scheme близок к лямбда-исчислению, где единственным механизмом повторения является рекурсия (ну или, совсем строго говоря, комбинатор неподвижной точки).

всё правильно, есть в ней оптимизация хвостовой рекурсии, хотя это не написано большими буквами в доке. уронить её правильно написанной функцией позволяющей TCO не удастся - это легко проверить :) полагаю унаследовано ещё от minischeme.

Это написано большими буквами в стандарте R5RS, на основании которого сделан TinyScheme (Script-Fu). Ну и содержательно это связано с тем, как вообще в Scheme реализуются рекурсивные вызовы (через продолжения, в отличие от классического Лиспа).

R5RS, на основании которого сделан TinyScheme

по-моему несколько лет назад когда я в него заглядывал он не 100% покрывал R5RS и с тех пор вряд ли что-то добавилось, поэтому такие заключения стоит делать с осторожностью. но TCO есть.

Конечно, неполное соответствие стандарту формально позволяет не соответствовать и в этой части. Но если из Scheme выкинуть TCO, то из-за этого очень много придётся переписывать руками в части реализации конструкций языка. Например, тот же макрос do, всю механику call/cc. Да собственно все синтаксические диаграммы Scheme строятся относительно tail context. Так что это была бы масса бессмысленной работы ради жалкого результата.

в чём то вы конечно правы, должна, но как у нас говорят не обязана. А вот правы вы в том, что (простите за тафтологию) совершенно правы!!! Я никогда не обращал внимание на раскрытие именованного макроса, думал это специальная форма - именованный лет, а он и правда расскрывается до letrec c определением лямбды.

(get-closure-code fold)
;; (lambda (f init lst)
;;   (letrec ((gensym-17 (lambda (rez l)
;;                         (if (null? l)
;;                             (begin rez)
;;                             (begin
;;                               (gensym-17 (f rez (car l)) (cdr l)))))))
;;     (gensym-17 init lst)))

А я то дурак в исходном коде копался никак не мог разобраться, когда там создаётся новый фрейм.

И кстати у меня там на gitflic лежит интерпретатор лямбда выражений из лямбда исчисления, как раз для демонстрации работы Y комбинатора писал.

Обязана-обязана :) В этом отличие Scheme от Лиспа.

пробовал, не понравилось, по разным причинам. Или ГИМП не совместим, или еще какие не нужные артефакты выводятся. не понравилось. не помню, там вроде script-fu надо стартовать в режиме сервера, а он без консоли, ну иногда хочется что то и в консоли ввести. Ну вообщем не понравилось, но Вы совершенно правы, так работать можно. Может быть если бы подольше с этим поковырялся и разобрался бы получше, так и полюбил бы такой режим.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации