Der Schläger 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, sind aber ansonsten abwärtskompatibel. Der mit Racket gelieferte Compiler kann natürlich auch im R5RS- oder R6RS-Modus ausgeführt werden. Ein 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. Die wichtigsten Punkte, an denen es nicht abwärtskompatibel ist, sind:
- Racket hat kein
set-cdr!
und set-car!
, set-mcar!
was nur bei Paaren funktioniert, die speziell als veränderlich erstellt wurden.
- Was Racket aufruft,
letrec
wird letrec*
in R6RS aufgerufen und existiert in R5RS nicht, was R5RS und R6RS aufrufenletrec
in Racket nicht vorhanden sind.
- In Racket bewerten sich viele Dinge selbst, was zu einem Fehler in R5RS führen würde,
vor allem in der leeren Liste .
- Der Schläger unterscheidet zwischen Groß- und Kleinschreibung, R6RS unterscheidet jedoch auch zwischen Groß- und Kleinschreibung
- Schläger behandelt
( ... )
und [ ... ]
als gleichwertig tut R5RS nicht, aber R6RS tut.
Es gibt wahrscheinlich mehr, aber in den meisten anderen Teilen ist Schläger eine Obermenge von Schema.
()
ist ungültig, nicht selbstbewertend. Racket hat auch die eingeschränkterenletrec
- zum Beispiel die in derr5rs
Sprache; Es ist beabsichtigt, dieletrec*
ähnliche Version in der Standardsprache zu verwenden.()
selbst zu bewerten, ich war mit diesem verwechselt. Ich habe nie wirklich verstanden, warum ich mich()
in Scheme nicht selbst bewertet habe, wie es in Common Lisp der Fall ist.#%app
:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
Es enthält unveränderliche Listen, wie oben erwähnt. Es enthält auch ein Struktursystem, das etwas sauberer ist als das R6RS-Aufzeichnungssystem. Es hat ein objektorientiertes Klassen- und Objektsystem. Es hat native Unterstützung für Design durch Vertrag. Es verfügt über 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 als etwas anderes als eine Marketing-Spielerei nützlich war, aber Schläger ist definitiv ein eindeutiger Dialekt des Schemas.
quelle
Die Gründe für die Namensänderung von PLT-Schema zu Racket werden auf der Racket-Site erörtert .
quelle
Die Sprachspezifikation R5RS für die Programmiersprache Scheme basiert auf einem Konsens zwischen den mehreren Schema-Implementierern. Dies bedeutet, dass die Sprache sehr stabil ist. Dies bedeutet 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.
Funktionen in Racket, die nicht nur von Makros implementiert werden können:
Das Modul und das Makrosystem sind viel allgemeiner als die RnRS-Spezifikation. Zusammen mit der
#lang
Reader- / Sprachspezifikation können benutzerdefinierte Sprachen (mit benutzerdefinierter Syntax) definiert und mit normalen Racket-Programmen verwendet werden.In einigen Fällen hat Racket Konstrukte, deren Verhalten von R5RS abweicht. Das offensichtlichste ist, ein
cons
Konstrukt zu einem unveränderlichen Paar zu machen (mcons
konstruiert ein veränderliches Paar). Ein Vorteil eines unveränderlichen Paares besteht darin, dass eslength
jetzt in O (1) amortisierter Zeit läuft.quelle
Racket enthält viele wirklich nette Sprachkonstrukte, die nicht im R6RS-Schema enthalten sind, wie "match" .
quelle
match
ist sehr schön, aber zum Glück ist es nur ein Makro, so dass es leicht zu Lisps hinzugefügt werden kann, die es nicht haben. Common Lisp kann über Muster einen Lichtmusterabgleich für Listen durchführendestructuring-bind
. Es ist einfach, ein daraufdestructuring-case
basierendes Makro zu schreiben , und viele Leute haben es. Für das Schema gibt es tragbarematch
Bibliotheken. Clojure hatcore.match
.Zum Beispiel sind Schlägerlisten standardmäßig unveränderlich, während Schemas veränderlich sind. Racket enthält auch viele Standardbibliotheken (z. B. Webserver), die andere Schemata nicht enthalten.
quelle