Опытный махинатор, letcc и guile

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

  2. letcc, похоже, не существует в версии guile (1.8.7), которую я установил в OS X. Есть ли для него другое имя, которое мне следует искать в guile?

  3. Если я неправильно понимаю letcc, сравнивая его с try/catch в Java или catch/throw в ruby ​​(что не обработка исключений, просто для ясности, для не-рубисты), как именно это работает на функциональном уровне? Можно ли это выразить более длинным и сложным способом, который убедит меня, что он в конце концов функционален?

8
задан Óscar López 13 November 2013 в 15:21
поделиться