Odpowiedzi:
Rakieta ostatecznie opiera się na R5RS, a nie R6RS i nie jest ścisłym nadzorem żadnego z nich. Nie sądzę, że można go nazwać „Scheme”, ponieważ nie jest on wstecznie zgodny z żadnym standardem Scheme.
Większość implementacji oferuje rozszerzenia, ale poza tym są kompatybilne wstecz, oczywiście kompilator dostarczany z Racket może także działać w trybie R5RS lub R6RS. Prawidłowy schemat R5 / 6RS działający w trybie rakiety może zostać odrzucony, powodować błędy w czasie wykonywania lub zachowywać się inaczej niż powinien. Biorąc to pod uwagę, głównymi punktami niezgodności wstecznej są:
set-cdr!
i set-car!
raczej set-mcar!
który działa tylko w parach specjalnie utworzonych jako zmienny.letrec
się letrec*
w R6RS i nie istnieje w R5RS, co nazywają R5RS i R6RSletrec
nie istnieje w Racket.( ... )
i [ ... ]
jako odpowiednik R5RS nie, ale R6RS tak.Prawdopodobnie jest ich więcej, ale w większości innych części rakieta jest nadzbiorem schematu.
()
samoocenę, pomyliłem się z tym. Nigdy tak naprawdę nie rozumiem, dlaczego ()
nie poddałem się samoocenie w Schemacie, jak w Common Lisp.
#%app
, jednak:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
Zawiera niezmienne listy, jak wspomniano powyżej. Zawiera również system struktury, który jest nieco czystszy niż system zapisu R6RS. Ma klasę obiektową i system obiektowy. Ma natywne wsparcie dla projektowania na podstawie umowy. Ma system jednostkowy przypominający system modułowy ML, a także system modułowy podobny do systemu modułowego R6RS. Jestem pewien, że zapomniałem tyle rzeczy, ile wspomniałem.
Nie jestem pewien, czy zmiana nazwy była przydatna jako coś innego niż chwyt marketingowy, ale rakieta to zdecydowanie odrębny dialekt schematu.
Uzasadnienie zmiany nazwy ze schematu PLT na Racket jest omówione na stronie Racket .
Specyfikacja języka R5RS w języku programowania Scheme opiera się na konsensusie między wieloma implementatorami schematu. Oznacza to, że język jest bardzo stabilny. Oznacza to również, że wiele przydatnych funkcji nie jest częścią standardu R5RS.
Rakieta zbudowała na R5RS i znacznie ją rozszerzyła. Niektóre rozszerzenia są zdefiniowane jako makra, ale niektóre funkcje wymagają obsługi systemu wykonawczego.
Funkcje w Racket nie mogą być implementowane przez same makra:
Moduł i system makr są znacznie bardziej ogólne niż specyfikacja RnRS. Wraz ze #lang
specyfikacją czytnika / języka umożliwia definiowanie niestandardowych języków (z niestandardową składnią) i używanie ich z normalnymi programami rakietowymi.
W kilku przypadkach rakieta ma konstrukcje, których zachowanie odbiega od R5RS. Najbardziej oczywistym jest uczynienie z cons
konstruktu pary niezmiennej ( mcons
konstruuje parę zmienną). Jedną z zalet posiadania niezmiennych par jest to, że length
teraz działa w zamortyzowanym czasie O (1).
Rakieta zawiera wiele naprawdę fajnych konstrukcji językowych nieuwzględnionych w schemacie R6RS, takich jak „dopasuj” .
match
jest bardzo fajny, ale na szczęście jest to tylko makro, dzięki czemu można go łatwo dodać do Lisps, które go nie mają. Common Lisp może dopasowywać lekkie wzorce do list za pośrednictwem destructuring-bind
. Na podstawie tego można łatwo napisać destructuring-case
makro, a wiele osób je ma. W przypadku Schematu istnieją przenośne match
biblioteki. Clojure ma core.match
.
W jednym wielkim przykładzie listy rakiet są domyślnie niezmienne, podczas gdy schematy są zmienne. Rakieta zawiera również wiele standardowych bibliotek (np. Serwer WWW), których nie mają inne schematy.
()
jest nieprawidłowy, nie ma wartości samooceny. Również Rakieta robi się bardziej ograniczoneletrec
- na przykład, jeden wr5rs
języku; celowym wyborem jest użycieletrec*
wersji podobnej do domyślnego języka.