История изменений
Исправление monk, (текущая версия) :
Так зачем же она нужна? Дело опять в оптимизации?
В оптимизации. Обход дерева
(define (do-tree tree func)
(unless (empty tree)
(func (head tree))
(do-tree (left tree))
(do-tree (right tree))))
последний вызов do-tree хвостовой и не занимает стек. Если переписать в виде цикла будет не так красиво
(define (do-tree-loop tree func)
(until (empty tree)
(func (head tree))
(do-tree-loop (left tree))
(set! tree (right tree))))
С точки зрения разработчиков и большинства пользователей Scheme программа без set! всегда красивее, так как глядя на процедуру можно сразу увидеть ход (workflow) процедуры не прыгая взглядом назад (для цикла дойдя до (set! tree ...) приходится ещё раз посмотреть всё выше для оценки того, как изменится ход программы с новым значением tree.
Исходная версия monk, :
Так зачем же она нужна? Дело опять в оптимизации?
В оптимизации. Обход дерева
(define (do-tree tree func)
(unless (empty tree)
(func (head tree))
(do-tree (left tree))
(do-tree (right tree))))
последний вызов do-tree хвостовой и не занимает стек. Если переписать в виде цикла будет не так красиво
(define (do-tree-loop tree func)
(until (empty tree)
(func (head tree))
(do-tree (left tree))
(set! tree (right tree))))
С точки зрения разработчиков и большинства пользователей Scheme программа без set! всегда красивее, так как глядя на процедуру можно сразу увидеть ход (workflow) процедуры не прыгая взглядом назад (для цикла дойдя до (set! tree ...) приходится ещё раз посмотреть всё выше для оценки того, как изменится ход программы с новым значением tree.