Der erfahrene Schemer, letcc und guile

Hier ein paar Fragen zuletcc das wird in The Seasoned Schemer verwendet.

(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))))))

Ich glaube ich verstehe wasletcc erreicht, und das ist im Grunde so etwas wiecatch undthrow in ruby ​​(und anscheinend in CL), was im Grunde bedeutet, dass ein ganzer Codeblock durch Aufrufen eines beliebigen Namens gekürzt werden kannletcc ist. Dies scheint das am wenigsten "funktionale" zu sein, auf das ich in dieser kurzen Reihe von Büchern gestoßen bin, und ich fühle mich ein bisschen zögernd, es zu verwenden, da ich einen guten funktionalen Stil lernen möchte. Bin ich nur ein Missverständnisletcc, oder handelt es sich nicht wirklich um ein funktionales Programmierkonzept, das nur zur Leistungssteigerung dient? Die ganze Vorstellung, dass ich mitten in der Routine sein und dann plötzlich an einen anderen Punkt im Code gelangen kann, fühlt sich ein bisschen falsch an ... als würde ich try / catch in Java für den Programmfluss missbrauchen.

letcc scheint in der Version von guile (1.8.7), die ich in OS X installiert habe, nicht zu existieren. Gibt es einen anderen Namen dafür, nach dem ich in guile suchen sollte?

Wenn ich das missversteheletcc durch Vergleich mit try / catch in Java oder catch / throw in ruby ​​(das istnicht Ausnahmebehandlung (nur um es den Nicht-Rubyisten klar zu machen): Wie genau funktioniert das auf funktionaler Ebene? Kann man es länger und komplexer ausdrücken, was mich überzeugt, dass es doch funktioniert?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage