Risposte:
Alla fine la racchetta si basa su R5RS e non su R6RS e non è un superset rigoroso di entrambi. Non penso che possa essere chiamato "Schema" perché non è retrocompatibile con nessuno standard Scheme.
La maggior parte delle implementazioni offre estensioni, ma per il resto sono compatibili con le versioni precedenti, ovviamente, il compilatore fornito con Racket può anche funzionare in modalità R5RS o R6RS. Lo schema R5 / 6RS valido che viene eseguito in modalità racchetta può essere rifiutato, causare errori di runtime o comportarsi in modo diverso rispetto a quanto dovrebbe. Detto questo, i punti principali in cui non è compatibile con le versioni precedenti sono:
set-cdr!
e set-car!
, anzi, set-mcar!
funziona solo su coppie create appositamente come mutabili.letrec
viene chiamato letrec*
in R6RS e non esiste in R5RS, ciò che chiamate R5RS e R6RS letrec
non esiste in Racchetta.( ... )
e [ ... ]
come equivalente, R5RS no, ma R6RS no.Probabilmente ce ne sono altri, ma sulla maggior parte delle altre parti la racchetta è un superset di Scheme.
()
l'autovalutazione, ero confuso con quello. Non ho mai davvero ()
capito perché non si autovalutasse in Scheme come in Common Lisp.
#%app
, tuttavia:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
Contiene elenchi immutabili, come menzionato sopra. Contiene anche un sistema di struttura un po 'più pulito del sistema di registrazione R6RS. Ha una classe orientata agli oggetti e un sistema di oggetti. Ha il supporto nativo per la progettazione per contratto. Ha un sistema di unità che ricorda il sistema di moduli ML, nonché un sistema di moduli molto simile al sistema di moduli R6RS. Sono sicuro di aver dimenticato tutte le cose che ho menzionato.
Non sono sicuro che la ridenominazione sia stata utile come qualcosa di diverso da un espediente di marketing, ma la racchetta è sicuramente un dialetto distinto di schema.
La logica del cambio di nome dallo schema PLT alla racchetta è discussa sul sito della racchetta .
La specifica del linguaggio R5RS sul linguaggio di programmazione dello Schema si basa sul consenso tra i vari implementatori dello Schema. Ciò implica che la lingua è molto stabile. Implica anche che molte utili funzioni non facciano parte dello standard R5RS.
La racchetta si basa su R5RS e l'ha estesa notevolmente. Alcune estensioni sono definite come macro, ma alcune funzionalità richiedono il supporto del sistema di runtime.
Funzionalità in Racket non implementabili dalle sole macro:
Il modulo e il sistema macro sono molto più generali delle specifiche RnRS. Insieme alle #lang
specifiche del lettore / lingua, è possibile definire lingue personalizzate (con sintassi personalizzata) e usarle con i normali programmi Racket.
In alcuni casi la racchetta ha costrutti il cui comportamento si discosta dall'R5RS. Il più ovvio sta facendo cons
costruire una coppia immutabile ( mcons
costruisce una coppia mutabile). Un vantaggio di avere coppie immutabili è che length
ora corre nel tempo ammortizzato O (1).
La racchetta include molti costrutti di linguaggio davvero belli non inclusi nello schema R6RS, come "match" .
match
è molto bello ma per fortuna è solo una macro, quindi può essere facilmente aggiunta a Lisps che non ce l'hanno. Tramite Lisp comune è possibile eseguire la corrispondenza dei pattern di luce negli elenchi destructuring-bind
. È semplice scrivere una destructuring-case
macro basata su di essa, e molte persone hanno. Per Scheme ci sono match
librerie portatili . Clojure ha core.match
.
()
non è valido, non si auto-valuta. Inoltre, Racket non hanno la più ristrettoletrec
- per esempio, quello delr5rs
linguaggio; è una scelta intenzionale utilizzare laletrec*
versione simile nella lingua predefinita.