Mientras leía "The Seasoned Schemer", comencé a aprender sobre letrec
. Entiendo lo que hace (puede duplicarse con un Y-Combinator) pero el libro lo está usando en lugar de recurrir en la función d ya define
que opera en argumentos que permanecen estáticos.¿Cuáles son los beneficios de letrec?
Un ejemplo de una función de edad usando la función define
d recurrentes sobre sí mismo (nada especial):
(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))))))
Ahora un ejemplo de esa misma función pero utilizando 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)))
Aparte de ser un poco más largo y más difícil de leer, no sé por qué están reescribiendo funciones en el libro para usar letrec. ¿Hay una mejora de velocidad cuando se repite sobre una variable estática de esta manera porque no la sigues pasando?
¿Es esta práctica estándar para funciones con argumentos que permanecen estáticos pero con un argumento reducido (como recurrir a los elementos de una lista)?
¡Alguna contribución de los Schemers/LISPers más experimentados sería útil!
¡Gracias por elaborar! +1 por supuesto. –
Como siempre, bien escrito y muy útil (gracias por mencionar el módulo de tiempo). Sé que recibo mucha ayuda de forma gratuita, así que gracias, Eli, por tomarse el tiempo que necesita para publicar sus respuestas. Sus discusiones de comentarios con los otros carteles también son útiles en las pequeñas cosas que no conozco o que no he tenido en cuenta. ¡Gracias de nuevo! – Ixmatus