Wie unterscheidet sich Racket von Scheme?

183

Racket ist ein Nachkomme von Scheme. Wie unterscheidet sich Racket von R6RS? Was hat es hinzugefügt oder weggenommen oder ist es 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.

Schlamm
quelle

Antworten:

131

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, letrecwird 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.

Zorf
quelle
23
In Racket ()ist ungültig, nicht selbstbewertend. Racket hat auch die eingeschränkteren letrec- zum Beispiel die in der r5rsSprache; Es ist beabsichtigt, die letrec*ähnliche Version in der Standardsprache zu verwenden.
Eli Barzilay
8
@ Eli, whoops, du hast recht, Schläger, die im Schwindelmodus laufen, scheinen sich ()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.
Zorf
@ Zorf Es kann jedoch leicht durch Überladung geändert werden #%app:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
Suzanne Dupéron
1
Diese Antwort sollte aktualisiert werden. Das Feature-Set von Racket überwiegt bei weitem das von Scheme mit Modulen und Sprachdefinitionen usw.
CinchBlue
@VermillionAzure Sie meinen, wie der Funktionsumfang einer praktischen Implementierung des Schemas überwiegt das Standardschema?
Mali Remorker
36

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.

deinst
quelle
23
Ich denke, die Umbenennung war, weil sie kein Scheme-Dialekt mit einer Reihe von nicht standardmäßigen Ergänzungen sein wollten - sie wollten eine schemabasierte Sprache mit einer Menge mehr Standard sein. Das Klassifizieren des PLT-Schemas als "nur" ein Dialekt des Schemas ist wie das Klassifizieren von Ruby als einen Dialekt von Mirah - es ist nicht ungenau, aber es spielt die Stärken der Sprache herunter.
Chuck
5
Ich denke, die Verwendung eines anderen Namens ist eine kluge Entscheidung: Die Verwendung des gleichen Namens für verschiedene Sprachen, die einen gemeinsamen Ursprung haben, ist IMO verwirrend. Ich würde den Namen ändern, selbst wenn die Sprache Schema als Teilmenge enthalten würde, aber so viele Ergänzungen enthalten würde, dass dies einen ganz anderen Programmierstil fördern würde.
Giorgio
17

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:

  • abgegrenzte Fortsetzungen (allgemeiner als call / cc)
  • Fortsetzungsmarken
  • Fäden
  • setzt
  • ffi

Das Modul und das Makrosystem sind viel allgemeiner als die RnRS-Spezifikation. Zusammen mit der #langReader- / 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 consKonstrukt zu einem unveränderlichen Paar zu machen ( mconskonstruiert ein veränderliches Paar). Ein Vorteil eines unveränderlichen Paares besteht darin, dass es lengthjetzt in O (1) amortisierter Zeit läuft.

Soegaard
quelle
2
... aber es macht das Anhängen der O (1) -Liste unmöglich.
Will Ness
16

Racket enthält viele wirklich nette Sprachkonstrukte, die nicht im R6RS-Schema enthalten sind, wie "match" .

Gautam
quelle
2
Warum sollte "Match" eine nette Funktion sein? Wenn Sie eine Meinung äußern, sollten Sie diese zumindest kurz erläutern, damit Personen, die mit Racket nicht gut vertraut sind, verstehen können, warum "Match" theoretisch von Vorteil ist.
nbro
1
Pattern Matching ist eine sehr erwünschte Funktion in vielen Sprachen mit funktionalem Programmierhintergrund. Leider implementiert dies nicht einmal R6RS oder Common Lisp standardmäßig. Ja, dies ist eine wirklich nette und differenzierte Funktion, die Racket bietet. Zum Beispiel bieten Sprachen wie Haskell, Elixir, Rust und F # diese Art von Konstruktionen und werden häufig verwendet. Ich persönlich mache Lisp-Programmierung hauptsächlich in Common Lisp und ich vermisse in vielen Fällen das Fehlen einer Implementierung für den Mustervergleich.
Manoel Vilela
matchist 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ühren destructuring-bind. Es ist einfach, ein darauf destructuring-casebasierendes Makro zu schreiben , und viele Leute haben es. Für das Schema gibt es tragbare matchBibliotheken. Clojure hat core.match.
Lassi
Makros können das Lesen von Code erschweren, da sie häufig eine spezielle Semantik haben. Daher sollte die Sprache immer alle Allzweckmakros standardisieren, damit nicht jeder seine eigenen Makros erstellt. Der Mustervergleich sollte genau wie in Arc & Clojure & Racket & Ocaml & Haskell die Standardeinstellung sein, da er die Absicht direkter angibt. Caddr ist zu niedrig.
aoeu256
11

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.

Futter
quelle