Каковы преимущества letrec?

Читая «Закаленный интриган», я начал узнавать о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 помог бы!

Ответы на вопрос(3)

Ваш ответ на вопрос