it-swarm.com.de

Inwiefern unterscheidet sich Racket von Scheme?

Racket ist ein Nachkomme von Scheme. Wie unterscheidet sich Racket von R6RS? Was hat es hinzugefügt oder weggenommen oder ist einfach anders?

Ich verstehe, dass Racket mehr als eine Sprache ist, es ist eine Plattform für Sprachen. Aber ich beziehe mich auf den Haupt-Racket-Dialekt.

169
mudge

Racket basiert letztendlich auf R5RS und nicht auf R6RS und auch nicht auf einer strengen Obermenge. Ich glaube nicht, dass es als "Schema" bezeichnet werden kann, da es mit keinem Schema-Standard abwärtskompatibel ist.

Die meisten Implementierungen bieten Erweiterungen, ansonsten sind sie jedoch abwärtskompatibel. Natürlich kann der mit Racket gelieferte Compiler auch im R5RS- oder R6RS-Modus ausgeführt werden. Gültiges R5/6RS-Schema, das im Racket-Modus ausgeführt wird, kann entweder abgelehnt werden, Laufzeitfehler verursachen oder sich anders verhalten, als es sollte. Vor diesem Hintergrund sind die Hauptpunkte, an denen es nicht abwärtskompatibel ist:

  • Schläger hat kein set-cdr! und set-car!, lieber set-mcar! funktioniert nur bei Paaren, die speziell als veränderlich erstellt wurden.
  • Was Racket letrec nennt, heißt letrec* in R6RS und existiert in R5RS nicht, was R5RS und R6RS letrec nennen, existiert in Racket nicht.
  • In Racket sind viele Dinge selbsteinschätzend, was einen Fehler in R5RS auslösen würde. am wichtigsten ist die leere Liste.
  • Beim Schläger wird die Groß- und Kleinschreibung beachtet, beim R6RS wird jedoch auch die Groß- und Kleinschreibung beachtet
  • Schläger Leckereien ( ... ) und [ ... ] als Äquivalent, R5RS nicht, aber R6RS.

Es gibt wahrscheinlich mehr, aber bei den meisten anderen Teilen ist Racket eine Obermenge von Scheme.

121
Zorf

Es enthält unveränderliche Listen, wie oben erwähnt. Es enthält auch ein Struktursystem, das etwas übersichtlicher ist als das R6RS-Aufzeichnungssystem. Es hat ein objektorientiertes Klassen- und Objektsystem. Es hat native Unterstützung für Design by Contract. Es hat ein Einheitensystem, das an das ML-Modulsystem erinnert, sowie ein Modulsystem, das dem R6RS-Modulsystem sehr ähnlich ist. Ich bin sicher, ich habe so viele Dinge vergessen, wie ich erwähnt habe.

Ich bin mir nicht sicher, ob die Umbenennung etwas anderes als ein Marketing-Trick war, aber Schläger ist definitiv ein klarer Dialekt des Schemas.

33
deinst

Die Gründe für die Namensänderung vom PLT-Schema zum Racket werden diskutiert auf der Racket-Site .

21
Norman Gray

Racket enthält eine Menge wirklich netter Sprachkonstrukte, die nicht im R6RS-Schema enthalten sind, wie "match" .

17
Gautam

Die Sprachspezifikation R5RS für die Scheme-Programmiersprache basiert auf einem Konsens zwischen den mehreren Scheme-Implementierern. Dies impliziert, dass die Sprache sehr stabil ist. Dies impliziert auch, dass viele nützliche Funktionen nicht Teil des R5RS-Standards sind.

Racket hat auf R5RS aufgebaut und es stark erweitert. Einige Erweiterungen sind als Makros definiert, einige Funktionen erfordern jedoch die Unterstützung des Laufzeitsystems.

Features in Racket, die nicht nur von Makros implementiert werden können:

  • abgegrenzte Fortsetzungen (allgemeiner als call/cc)
  • fortsetzungszeichen
  • fäden
  • setzt
  • ffi

Das Modul und das Makrosystem sind viel allgemeiner als die RnRS-Spezifikation. Zusammen mit #lang Reader/Sprachspezifikation ermöglicht die Definition von benutzerdefinierten Sprachen (mit benutzerdefinierter Syntax) und deren Verwendung mit normalen Racket-Programmen.

In einigen Fällen hat Racket Konstrukte, deren Verhalten von R5RS abweicht. Das offensichtlichste ist, cons zu einem unveränderlichen Paar zu konstruieren (mcons konstruiert ein veränderliches Paar). Ein Vorteil von unveränderlichen Paaren ist, dass length jetzt in O(1) amortisierter Zeit ausgeführt wird.

14
soegaard

Zum Beispiel sind Racket-Listen standardmäßig unveränderlich, wohingegen Schemas veränderlich sind. Racket enthält auch viele Standardbibliotheken (z. B. Webserver), die andere Schemata nicht unterstützen.

10
Chuck