Здесь несколько вопросов относительно letcc
, то есть
(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))))))
Думаю, я понимаю, чего достигает letcc
, и это в основном что-то вроде catch
и throw
в ruby (и, похоже, CL ), что в основном означает, что целый блок кода можно сократить, вызвав любое имя letcc
. заставляет меня чувствовать себя немного нерешительно использовать его, так как я хочу изучить хороший функциональный стиль Я просто неправильно понимаю letcc
, или это не совсем концепция функционального программирования и существует только для повышения производительности? идея о том, что я могу быть в середине какой-то рутины, а затем внезапно добраться до другого места в коде, кажется немного неправильной...например, злоупотребление try/catch в Java для выполнения программы.
letcc
, похоже, не существует в версии guile (1.8.7), которую я установил в OS X. Есть ли для него другое имя, которое мне следует искать в guile?
Если я неправильно понимаю letcc
, сравнивая его с try/catch в Java или catch/throw в ruby (что не обработка исключений, просто для ясности, для не-рубисты), как именно это работает на функциональном уровне? Можно ли это выразить более длинным и сложным способом, который убедит меня, что он в конце концов функционален?