The Seasoned Schemer, letcc e guile
Algumas perguntas aqui, sobreletcc
que é usado no 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))))))
Acho que entendi o queletcc
alcança, e isso é basicamente algo comocatch
ethrow
em ruby (e aparentemente CL), o que basicamente significa que um bloco inteiro de código pode ser interrompido chamando qualquer que seja o nomeletcc
é. Isso parece a coisa menos "funcional" que eu já vi nesta pequena série de livros e isso me faz sentir um pouco hesitante em usá-lo, já que eu quero aprender um bom estilo funcional. Eu sou apenas mal-entendidoletcc
, ou não é realmente um conceito de programação funcional e só existe para melhorar o desempenho? A idéia de que eu possa estar no meio de alguma rotina e, de repente, chegar a outro ponto no código, parece um pouco errado ... como abusar do try / catch em Java para o fluxo do programa.
letcc
parece não existir na versão do guile (1.8.7) Eu instalei no OS X. Existe outro nome para ele que eu deveria estar procurando em guile?
Se eu estou entendendo malletcc
comparando com try / catch em Java, ou catch / throw em ruby (que énão manipulação de exceção, só para ficar claro, para os não-rubistas), como exatamente funciona, no nível funcional? Pode ser expresso de uma maneira mais longa e complexa, que me convence de que é funcional afinal de contas?