Какой из них вы используете, это в основном вопрос стиля.
Я не часто использую letrec
, просто предпочитаю внутренние определения. Я использую named let довольно часто для написания хвостовых рекурсивных циклов, похожих на этот бессмысленный цикл.
(let loop ((var init) (other-var other-init))
(cond
((done? var) var)
((finished? other-var) other-var)
(else (loop (modify var) (manipulate other-var)))))
Вы можете сделать то же самое с letrec
или внутренним определением, но я считаю, что это легче всего читать.
letrec
может быть полезно при расширении макроса в места, в которых вы не хотите создавать определения.