Читая «Закаленный интриган», я начал изучать letrec
. Я понимаю, что он делает (может быть продублирован с помощью Y-Combinator), но книга использует его вместо повторения функции уже define
d, работающей с аргументами, которые остаются статическими.
Пример старой функции, использующей функцию define
d, повторяющуюся сама по себе (ничего особенного):
(define (substitute new old l)
(cond
((null? l) '())
((eq? (car l) old)
(cons new (substitute new old (cdr l))))
(else
(cons (car l) (substitute new old (cdr l))))))
Теперь для примера той же функции, но с использованием letrec
:
(define (substitute new old l)
(letrec
((replace
(lambda (l)
(cond
((null? l) '())
((eq? (car l) old)
(cons new (replace (cdr l))))
(else
(cons (car l) (replace (cdr l))))))))
(replace lat)))
Помимо того, что они немного длиннее и сложнее для чтения, я не знаю, почему они переписывают функции в книге, чтобы использовать letrec. Есть ли увеличение скорости при повторении статической переменной таким образом, потому что вы не продолжаете передавать ее ??
Является ли это стандартной практикой для функций с аргументами, которые остаются статическими, но с одним аргументом, который сокращен (например, повторяющиеся элементы списка)?
Некоторая информация от более опытных Schemers / LISPers поможет!