Rakieta ostatecznie opiera się na R5RS, a nie R6RS, a nie na ścisłym nadzębie. Nie sądzę, że można go nazwać "Scheme", ponieważ nie jest on zgodny z jakimkolwiek standardem Scheme.
Większość wdrożeń oferuje rozszerzenia, ale w przeciwnym razie są one kompatybilne wstecznie, oczywiście kompilator, który jest dostarczany z Rackem, może również działać w trybie R5RS lub R6RS. Prawidłowy schemat R5/6RS, który działa w trybie rakietowym, może zostać odrzucony, spowodować błędy w czasie wykonywania lub zachowywać się inaczej niż powinien. Z powiedział, że główne punkty, w których nie jest wstecznie kompatybilne są:
- rakieta nie ma
set-cdr!
i set-car!
raczej set-mcar!
który działa tylko w parach specjalnie utworzonych jako zmienny.
- Co Racket nazywa
letrec
nazywa się letrec*
w R6RS i nie istnieje w R5RS, co R5RS i R6RS zadzwoń letrec
nie istnieje w Racket.
- W grze Racket wiele rzeczy jest samoocena, co spowodowałoby błąd w R5RS,
, co najważniejsze - pustą listę.
- Rakieta jest wielkość liter, choć R6RS jest również wielkość liter
- Rakieta traktuje
(...)
i [ ... ]
jako ekwiwalent, R5RS nie robi, ale R6RS robi.
Prawdopodobnie istnieje więcej, ale w przypadku większości innych części rakieta jest nadzbiorem schematu.
W Racket '()' jest nieprawidłowe, nie samooceny. Ponadto, Racket * ma * bardziej ograniczone 'letrec' - na przykład, w języku' r5rs'; jest to celowy wybór, aby użyć wersji 'letrec *' w domyślnym języku. –
@ Eli, whoops, masz rację, rakieta działająca w trybie Swindle wydaje się uważać '()' samooceny, byłem zdezorientowany z tym. Nigdy tak naprawdę nie rozumiem, dlaczego '()' nie było samooceną w Scheme, jak to jest w Common Lisp. – Zorf
@Zorf Można go łatwo zmienić przez przeciążenie '#% aplikacji', chociaż:' #lang rakieta (wymaga (zmiana nazwy-w rakiecie [#% starej aplikacji])) (define-syntax #% app (syntax-rules() [(_) '()] [(_. reszta) (stary reszta)])) (null?()) ;; => # t' –