Выражайте циклы через именованный let или взаимно рекурсивные процедуры с вызовами в документированных хвостовых позициях.
Кратко
LISPEX
(let loop ((xs (list 1 2 3 4)) (sum 0)) (if (null? xs) sum (loop (cdr xs) (+ sum (car xs)))))Результат
OUTPUT
10Рабочий порядок
- Передавайте аккумуляторы параметрами вместо работы после возврата рекурсии.
- Хвостовая позиция сохраняется в последних путях
if,begin,and/or,cond,case,do,call-with-valuesиapply. - В тестах ограничивайте вход и отличайте глубину continuation от стоимости выполнения.
Границы
- Хвостовая безопасность не завершает бесконечный цикл и не отменяет бюджеты ресурсов.