2010-07-27 19 views
145

Rakieta jest potomkiem schematu. Czym różni się Racket od R6RS? Co dodało lub zabrało, czy jest po prostu inne?Czym różni się Rakietowy od Planu?

Rozumiem, że Rakieta jest czymś więcej niż językiem, jest platformą dla języków. Ale mam na myśli główny dialekt rakietowy.

Odpowiedz

107

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.

+20

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. –

+8

@ 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

+0

@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' –

9

Dla jednego dużego przykładu, listy Racket są domyślnie niezmienne, podczas gdy Schematy są zmienne. Rakieta zawiera także wiele standardowych bibliotek (np. Web Server), których nie posiadają inne Plany.

29

Zawiera niezmienne listy, jak wspomniano powyżej. Zawiera również system struktury, który jest nieco czystszy niż system rekordów R6RS. Ma obiektowy system klasy i obiektu. Ma natywne wsparcie dla projektu na podstawie umowy. Ma system jednostek przypominający system modułów ML, a także system modułów podobny do systemu modułów R6RS. Jestem pewien, że zapomniałem tak wiele rzeczy, o których wspomniałem.

Nie jestem pewien, czy zmiana nazwy była przydatna jako coś innego niż chwyt marketingowy, ale rakieta zdecydowanie jest wyraźnym dialektem schematu.

+17

Myślę, że zmiana nazwy polegała na tym, że nie chcieli być dialektem Schematu z mnóstwem niestandardowych dodatków - chcieli być językiem opartym na Schemacie z wieloma innymi standardami. Klasyfikowanie PLT Scheme jako "tylko" dialektu Schematu jest jak klasyfikowanie Rubiego jako dialektu Mirah - nie jest niedokładne, ale raczej pomija mocne strony tego języka. – Chuck

+4

Myślę, że używanie innej nazwy jest mądrą decyzją: używanie tej samej nazwy dla różnych języków, które mają wspólne pochodzenie, jest mylące. Zmieniłbym nazwę, nawet jeśli język zawierał Schemat jako podzbiór, ale zawierał on wiele dodatków, które zachęcałyby do bardzo odmiennego stylu programowania. – Giorgio

12

Rakieta zawiera wiele naprawdę fajnych konstrukcji językowych, które nie są zawarte w schemacie R6RS, jak "match".

+0

Dlaczego "dopasowanie" byłoby fajną funkcją? Przynajmniej, gdy wyrażasz opinię, powinieneś podać jej krótkie wyjaśnienie, aby osoby, które nie są dobrze zaznajomione z Rakietą, mogły zrozumieć, dlaczego "mecz" jest teoretycznie korzystny. – nbro

+0

Pattern Matching to naprawdę pożądana funkcja w wielu językach z funkcjonalnymi środowiskami programowania, niestety nawet R6RS lub Common Lisp nie implementują tego domyślnie, więc tak, to jest naprawdę fajna i zróżnicowana funkcja jaką zapewnia Racket. Na przykład takie języki, jak Haskell, Elixir, Rust i F # zapewniają ten typ konstrukcji i są mocno wykorzystywane. Ja osobiście używam programowania Lisp głównie w Common Lisp i brakuje mi w wielu przypadkach braku implementacji wzorców. –

11

Specyfikacja językowa R5RS w języku programowania Scheme opiera się na konsensusie pomiędzy wieloma implementatorami Scheme. To oznacza, że ​​język jest bardzo stabilny. Oznacza to również, że wiele przydatnych funkcji nie należy do standardu R5RS.

Rakieta zbudowana na bazie R5RS i znacznie przedłużona. Niektóre rozszerzenia są zdefiniowane jako makra, ale niektóre funkcje wymagają obsługi systemu wykonawczego.

funkcje w Racket nie wykonalnych przez makr w monoterapii:

  • ograniczonych kontynuacje (bardziej ogólne niż CALL/cc)
  • kontynuacja znaki
  • nici
  • miejsca
  • FFI

Moduł i system makr są znacznie bardziej ogólne niż specyfikacja RnRS. Wraz z #lang specyfikacją czytnika/języka umożliwia definiowanie języków niestandardowych (z niestandardową składnią) i używanie ich w normalnych programach rakietowych.

W kilku przypadkach Rakieta ma konstrukcje, których zachowanie odbiega od R5RS. Najbardziej oczywistą z nich jest konstruowanie niezmiennej pary (cons) (mcons konstruuje zmienną parę). Jedną z zalet posiadania niezmiennych par jest to, że teraz działa w O (1) czasie amortyzacji.

+0

... ale powoduje, że lista O (1) staje się niemożliwa. –

Powiązane problemy