The Seasoned Schemer, letcc und guile

8

Hier ein paar Fragen zu letcc , die in The Seasoned Schemer verwendet werden.

%Vor%
  1. 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.

  2. 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?

  3. 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?

d11wtq 19.06.2012, 15:05
quelle

1 Antwort

11
  1. "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.

  2. 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.).

  3. 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%
  4. 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.

Eli Barzilay 19.06.2012, 16:49
quelle