Algunas preguntas aquí, con respecto a letcc
que se utiliza en The Seasoned Schemer.The Seasoned Schemer, letcc y astucia
(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 lo
letcc
se consiga, y que es, básicamente, algo así comocatch
ythrow
en Ruby (y aparentemente CL), que básicamente significa todo un bloque de código puede ser interrumpida por llamar a cualquier el nombreletcc
es. Esto se siente como la cosa menos "funcional" que he encontrado en esta pequeña serie de libros y me hace sentir un poco indeciso de usarlo, ya que quiero aprender un buen estilo funcional. ¿Acabo de malinterpretarletcc
, o no es realmente un concepto de programación funcional y solo existe para mejorar el rendimiento? La idea de que puedo estar en el medio de una rutina y de repente llegar a otro punto del código me parece un poco incorrecta ... como abusar de try/catch en Java para el flujo del programa.letcc
no parece existir en la versión de guile (1.8.7) que he instalado en OS X. ¿Hay otro nombre para el que debería estar buscando en astucia?Si estoy malentendido
letcc
comparándolo con try/catch en Java, o la captura/tirar rubí (que es no manejo de excepciones, para ser claros, para los no Rubyistas), ¿cómo es exactamente funciona, a nivel funcional? ¿Se puede expresar de una manera más larga y compleja que me convence de que es funcional después de todo?
Si tiene una implementación que admita ambas continuaciones "normales" y escape de continuación, normalmente es más barato usar esta última. El patrón en su ejemplo es un ajuste natural para las continuaciones de escape. La abreviatura estándar es 'let/ec'. – soegaard
FYI, [esta página] (http://community.schemewiki.org/?seasoned-schemer) muestra cómo definir 'letcc' en términos de' call/cc' utilizando una macro simple. –
@JonO, lo leí antes y lo intenté, pero engaño solo dice 'ERROR: sintaxis inválida()' 'ABORT: (misc-error)'. Comprobé que lo hice como dice la página, pero todavía no funciona. Probablemente descubriré por qué cuando llegue a aprender macros. – d11wtq