Hier ein paar Fragen zu letcc
, die in The Seasoned Schemer verwendet werden.
Ich denke, ich verstehe, was letcc
erreicht, und das ist im Grunde so etwas wie catch
und throw
in Ruby (und scheinbar CL), was im Grunde bedeutet, dass ein ganzer Block Code abgeschnitten werden kann Aufrufen, was auch immer der Name letcc
ist. Das fühlt sich an wie das am wenigsten "funktionale" Ding, das ich in dieser kurzen Serie von Büchern gefunden habe und es macht mich ein bisschen zögerlich, es zu benutzen, da ich einen guten funktionalen Stil lernen möchte. Verdenke ich nur letcc
oder ist es nicht wirklich ein funktionales Programmierungskonzept und existiert nur, um die Leistung zu verbessern? Die ganze Idee, dass ich mitten in irgendeiner Routine sein kann und dann plötzlich zu einem anderen Punkt im Code komme, fühlt sich ein bisschen falsch an ... wie den Versuch / Fang in Java für den Programmfluss zu missbrauchen.
letcc
scheint nicht in der Version von guile (1.8.7) zu existieren, die ich in OS X installiert habe. Gibt es einen anderen Namen dafür, nach dem ich in Guile suchen sollte?
Wenn ich letcc
falsch verstehe, indem ich es mit try / catch in Java vergleiche, oder ruby (das ist not für die Ausnahmebehandlung, um klar zu sein, für die Nicht-Rubyisten), wie genau funktioniert es, auf der funktionalen Ebene? Kann es auf eine längere, komplexere Art ausgedrückt werden, die mich überzeugt, dass es doch funktional ist?
"Funktional" hat mehrere Bedeutungen, aber keine populäre Bedeutung widerspricht Fortsetzungen in irgendeiner Weise. Sie können jedoch dazu missbraucht werden, schwer lesbaren Code zu erstellen. Sie sind keine Tools, die "für den Programmablauf missbraucht werden können" - sie sind Programmfluss-Tools.
Ich kann dir nicht helfen. Ich weiß, dass es in Guile halbwegs Fortsetzungen gab, aber ich weiß nicht, wo die Dinge stehen. Es sollte definitiv call-with-current-continuation
haben, normalerweise auch unter dem freundlicheren Namen von call/cc
, und let/cc
ist ein einfaches Makro, das mit call/cc
erstellt werden kann.
Ich kann Ihnen sagen, dass es in Racket eine let/cc
zusammen mit einem Bündel von andere bauen in der selben Familie auf und zusätzlich gibt es eine ganze Bibliothek verschiedener Kontrolloperatoren (mit einer umfangreichen Liste von Referenzen.).
Einfache Verwendungen von let/cc
sind in der Tat ähnlich wie Fang / Wurf-Dinge - genauer gesagt werden solche Fortsetzungen allgemein als "Escape-Fortsetzungen" (oder manchmal "aufwärts") bezeichnet. Dies ist die Art der Verwendung, die Sie in diesem Code haben, und die oft verwendet wird, um ein abort
oder ein return
zu implementieren.
Aber Fortsetzungen in Scheme sind Dinge, die an jedem Ort verwendet werden können. Für ein sehr einfaches Beispiel, das diesen Unterschied zeigt, versuchen Sie Folgendes:
%Vor%Schließlich, wenn Sie mehr über Fortsetzungen lesen möchten, können Sie die relevanten Teile von PLAI sehen, es gibt auch eine mehr kurze Beispielübersicht dass Matthew Könnte geschrieben haben, und Sie können einige Klassennotizen sehen, die ich auf PLAI basierend geschrieben habe, mit einigen Beispielen, die inspiriert wurden der letzte Beitrag.
Tags und Links functional-programming scheme seasoned-schemer