Czym różni się rakieta od programu?

184

Rakieta jest potomkiem Scheme. Czym różni się Rakieta od R6RS? Co to dodało, zabrało lub po prostu jest inne?

Rozumiem, że Rakieta to coś więcej niż język, to platforma dla języków. Ale mam na myśli główny dialekt Rakiety.

błoto
źródło

Odpowiedzi:

132

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ą:

  • Rakieta nie ma set-cdr!i set-car!raczej set-mcar!który działa tylko w parach specjalnie utworzonych jako zmienny.
  • To, co wywołuje Racket, nazywa letrecsię letrec*w R6RS i nie istnieje w R5RS, co nazywają R5RS i R6RSletrec nie istnieje w Racket.
  • W Racket wiele rzeczy jest samoocennych, co spowodowałoby błąd w R5RS, a przede wszystkim pustą listę .
  • W przypadku rakiety rozróżniana jest wielkość liter, ale w R6RS rozróżniana jest również wielkość liter
  • Rakieta traktuje ( ... )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.

Zorf
źródło
24
W Racket ()jest nieprawidłowy, nie ma wartości samooceny. Również Rakieta robi się bardziej ograniczone letrec- na przykład, jeden w r5rsjęzyku; celowym wyborem jest użycie letrec*wersji podobnej do domyślnego języka.
Eli Barzilay
9
@ Eli, ups, masz rację, rakieta działająca w trybie Swindle wydaje się rozważać ()samoocenę, pomyliłem się z tym. Nigdy tak naprawdę nie rozumiem, dlaczego ()nie poddałem się samoocenie w Schemacie, jak w Common Lisp.
Zorf
@Zorf Można to łatwo zmienić poprzez przeciążenie #%app, jednak:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
Suzanne Dupéron
2
Ta odpowiedź powinna zostać zaktualizowana. Zestaw funkcji rakiety znacznie przewyższa teraz Scheme, z modułami i definicjami języka itp.
CinchBlue,
1
@MaliRemorker Nie rozumiem dokładnie, co masz na myśli, ale Schemat jest obecnie na R7RS i na R6RS. Ale rakieta wciąż wyprzedza zestaw funkcji R6RS.
CinchBlue
36

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.

deinst
źródło
24
Myślę, że zmiana nazwy była spowodowana tym, że nie chcieli być jakimś dialektem Scheme z szeregiem niestandardowych dodatków - chcieli być językiem opartym na Schemacie z szeregiem innych standardowych rzeczy. Klasyfikowanie schematu PLT jako „tylko” dialektu schematu jest jak klasyfikowanie Ruby jako dialektu Mirah - to nie jest niedokładne, ale w pewnym sensie lekceważy mocne strony języka.
Chuck,
5
Myślę, że użycie innej nazwy to mądra decyzja: użycie tej samej nazwy dla różnych języków, które mają wspólne pochodzenie, jest mylące dla IMO. Zmieniłbym nazwę, nawet gdyby język zawierał Scheme jako podzbiór, ale zawierał tak wiele dodatków, że zachęcałoby to do zupełnie innego stylu programowania.
Giorgio
18

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:

  • rozdzielone kontynuacje (bardziej ogólne niż połączenie / DW)
  • znaki kontynuacji
  • wątki
  • miejsca
  • ffi

Moduł i system makr są znacznie bardziej ogólne niż specyfikacja RnRS. Wraz ze #langspecyfikacją 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 conskonstruktu pary niezmiennej ( mconskonstruuje parę zmienną). Jedną z zalet posiadania niezmiennych par jest to, że lengthteraz działa w zamortyzowanym czasie O (1).

soegaard
źródło
2
... ale uniemożliwia dołączenie listy O (1).
Czy Ness
16

Rakieta zawiera wiele naprawdę fajnych konstrukcji językowych nieuwzględnionych w schemacie R6RS, takich jak „dopasuj” .

Gautam
źródło
3
Dlaczego „dopasowanie” byłoby fajną funkcją? Przynajmniej, kiedy wyrażasz opinię, powinieneś krótko ją wyjaśnić, aby ludzie, którzy nie znają dobrze Rakiety, mogli zrozumieć, dlaczego „dopasowanie” jest teoretycznie korzystne.
nro
1
Dopasowywanie wzorców jest bardzo pożądaną funkcją w wielu językach z funkcjonalnym środowiskiem programowania, niestety nawet R6RS lub Common Lisp nie implementują tego domyślnie, więc tak, jest to naprawdę fajna i zróżnicowana funkcja, którą zapewnia Racket. Na przykład języki takie jak Haskell, Elixir, Rust i F # zapewniają tego rodzaju konstrukcje i są intensywnie używane. Osobiście programuję Lisp głównie we Common Lisp i często brakuje mi implementacji dopasowania wzorca.
Manoel Vilela,
1
matchjest 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-casemakro, a wiele osób je ma. W przypadku Schematu istnieją przenośne matchbiblioteki. Clojure ma core.match.
Lassi
Makra mogą utrudniać odczytanie kodu, ponieważ często mają specjalną semantykę, dlatego język powinien zawsze standaryzować wszystkie makra ogólnego przeznaczenia, tak aby wszyscy nie budowali własnych makr. Dopasowanie wzorca powinno być domyślne, tak jak w Arc & Clojure & Racket oraz Ocaml & Haskell, ponieważ bardziej bezpośrednio określa zamiar. Caddr ma zbyt niski poziom.
aoeu256
12

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.

Głaskanie pod brodę
źródło