The Seasoned Schemer, letcc and guile
Algunas preguntas aquí, con respecto aletcc
que se utiliza en The Seasoned Schemer.
(define (intersect-all sets)
(letcc hop
(letrec
((A (lambda (sets)
(cond
((null? (car sets)) (hop '())
((null? (cdr sets)) (car sets))
(else
(intersect (car sets)
(A (cdr sets)))))))
; definition of intersect removed for brevity
(cond
((null? sets) '())
(else (A sets))))))
Creo que entiendo queletcc
Lo logra, y eso es básicamente algo así.catch
ythrow
en ruby (y aparentemente CL), lo que básicamente significa que se puede cortar un bloque de código completo llamando a cualquiera que sea el nombreletcc
es. Esto se siente como la cosa menos "funcional" que he encontrado en esta corta serie de libros y me hace sentir un poco indeciso de usarlo, ya que quiero aprender un buen estilo funcional. Estoy solo malentendidoletcc
¿O no es realmente un concepto de programación funcional y solo existe para mejorar el rendimiento? La idea general de que puedo estar en medio de alguna rutina y luego llegar de repente a otro punto en el código se siente un poco mal ... como abusar de intentar / atrapar en Java para el flujo de programas.
letcc
no parece existir en la versión de guile (1.8.7) que he instalado en OS X. ¿Hay otro nombre para él que deba estar buscando en guile?
Si estoy entendiendo malletcc
comparándolo con try / catch en Java, o catch / throw en ruby (que esno manejo de excepciones, solo para ser claro, para los no rubistas), ¿cómo funciona exactamente, a nivel funcional? ¿Puede expresarse de una manera más larga y compleja, que me convenza de que es funcional después de todo?