Читая «The Seasoned Schemer», я начал узнавать о letrec
. Я понимаю, что он делает (можно дублировать с помощью Y-Combinator), но книга использует его вместо повторения на уже существующей функции define
d, работающей на аргументах, которые остаются статическими.Каковы преимущества letrec?
Пример старой функции с помощью функции 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 поможет!
Спасибо за разработку! +1 конечно. –
Как обычно, хорошо написано и очень полезно (спасибо за упоминание модуля синхронизации). Я знаю, что я получаю много твоей помощи бесплатно, поэтому, спасибо Эли за то, что ты тратишь время, чтобы опубликовать свои ответы. Ваш комментарий обсуждается с другими плакатами, также полезен в мелочах, которые я не знаю или не случайно. Еще раз спасибо! – Ixmatus