Jakie są różnice między Clojure, Scheme / Racket i Common Lisp?

120

Wiem, że są to dialekty tej samej rodziny języków zwanych seplenieniem, ale jakie dokładnie są różnice? Czy mógłbyś przedstawić przegląd, jeśli to możliwe, obejmujący takie tematy, jak składnia, cechy, funkcje i zasoby.

MaiaVictor
źródło
3
Proszę o bardziej ogólny przegląd różnic, ponieważ pomyślałem, że to pytanie może być przydatne dla wielu innych osób, przepraszam, jeśli brzmi obraźliwie.
MaiaVictor
4
Zawsze jestem zdezorientowany, który post powinien iść. To jest omówienie narzędzi, więc czy to jest pytanie do tutaj czy do programistów? Logicznie rzecz biorąc, powiedziałbym, że przenieś to do programistów, ponieważ nie prosi o rozwiązanie konkretnego problemu, ale jest to dobry post z dobrą odpowiedzią IMHO.
octopusgrabbus
1
@octopusgrabbus: pytanie jest zbyt szerokie. Porównanie trzech języków programowania pod względem „składni, cech, funkcji i zasobów” może z łatwością wypełnić książkę lub witrynę internetową. Stackoverflow jest przeznaczony dla osób, które mają problemy z programowaniem, nie jest to encyklopedia (Wikipedia), nie jest to ogólne forum dyskusyjne (Usenet), nie jest to strona porównująca języki ( rosettacode.org ). Najlepiej sprawdza się w przypadku rzeczywistego problemu programistycznego, w którym pytanie ma kod, a odpowiedzi również mają kod. Plus: nie wymyślaj problemów tylko dlatego, że ktoś się nudzi lub to jest hobby.
Rainer Joswig
3
To, że pytanie jest szerokie, nie oznacza, że ​​nie należy tutaj. Jest to całkowicie jasne pytanie iz pewnością jest to „prawdziwe pytanie dotyczące programowania”. StackOverflow ma być przede wszystkim zasobem społeczności [googleable] do dzielenia się wiedzą o programowaniu za pośrednictwem formatu pytań i odpowiedzi.
Dan Burton,
@RainerJoswig, mógłbym po prostu napisać wszystko, czego nauczyłem się o tych językach w ciągu ostatnich dni, kiedy się ich uczyłem, ale dzięki temu wątek byłby duży. To naprawdę źle, gdy zdasz sobie sprawę, że ludzie będą googlować w tego rodzaju krótkie zdania i nie będą w stanie uzyskać odpowiedzi, ponieważ duży tekst utrudnia im szybkie zrozumienie tego, o co są pytani. Dzięki temu o wiele więcej osób otrzyma dobrą odpowiedź.
MaiaVictor

Odpowiedzi:

103

Wszystkie mają ze sobą wiele wspólnego:

  • Języki dynamiczne
  • Mocno napisane
  • Skompilowane
  • Składnia w stylu Lispa, tj. Kod jest napisany jako struktury danych Lisp (formularze), a najczęściej stosowanym wzorcem są wywołania funkcji, takie jak: (function-name arg1 arg2)
  • Potężne systemy makr, które umożliwiają traktowanie kodu jako dane i generowanie dowolnego kodu w czasie wykonywania (często używane do „rozszerzania języka” o nową składnię lub tworzenia DSL)
  • Często używany w funkcjonalnym stylu programowania, chociaż ma zdolność dostosowywania się do innych paradygmatów
  • Nacisk na interaktywne programowanie za pomocą REPL (tj. Interaktywnie programujesz w działającej instancji kodu)

Wspólne cechy charakterystyczne Lispa:

Charakterystyczne cechy Clojure:

  • Największy ekosystem bibliotek, ponieważ możesz bezpośrednio używać dowolnych bibliotek Java
  • Wektory []i mapy {}używane jako standardowe oprócz standardowych list ()- oprócz ogólnej użyteczności wektorów i map niektórzy uważają, że jest to innowacja, która sprawia, że ​​ogólnie jest bardziej czytelna
  • Większy nacisk na niezmienność i leniwe programowanie funkcjonalne, nieco inspirowane przez Haskella
  • Silne możliwości współbieżności obsługiwane przez pamięć transakcyjną oprogramowania na poziomie języka (warto obejrzeć: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey )

Charakterystyczne cechy schematu:

  • Prawdopodobnie najprostszy i najłatwiejszy do nauczenia Lisp
  • Higieniczne makra (patrz http://en.wikipedia.org/wiki/Hygienic_macro ) - elegancko unika problemów z przypadkowym przechwytywaniem symboli w rozszerzeniach makro
mikera
źródło
11
to dobrze, ale może powinieneś wspomnieć, że rakieta to coś więcej niż „tylko” schemat; jest to system obsługujący wiele (ale powiązanych) języków (możesz nawet zdefiniować swój własny). Ponadto clojure ma różne sposoby programowania w stylu oo (zarówno podejście do wielokrotnego wysyłania, nieco podobne do Cl, jak i coś bliższego java, które jest bardziej wydajne w jvm). a schemat zmierza w kierunku bardziej standardowych bibliotek (w tym również oo) z r6rs, które obsługują rakietę.
andrew cooke
2
„Dynamiczny język z silną typografią” to marketing. W tym sensie nawet Python jest silnie wpisany.
ron
16
@ron: Python jest silnie wpisywany, podobnie jak Lisp (w przeciwieństwie do, powiedzmy, Javascript lub VB). Zamiast tego myślisz o „wpisywaniu statycznym” w porównaniu z „pisaniem dynamicznym”, zobacz en.wikipedia.org/wiki/Type_system dla wszystkich odmian. Ale tak, to marketing
Nas Banov
2
Uważam również, że Racket byłby dobry do dodania do tej odpowiedzi. Myślę, że Racket jest jeszcze łatwiejszy do nauczenia niż Scheme ze względu na społeczność i skupienie się na języku. Rakieta (dawniej nazywana schematem PLT) jest językiem programowania ogólnego przeznaczenia z wieloma paradygmatami z rodziny Lisp / Scheme. Jednym z celów projektowych jest służenie jako platforma do tworzenia, projektowania i implementacji języka.
mtelesha
Clojure ma higieniczne makra. Więcej informacji tutaj: xivilization.net/~marek/blog/2013/09/17/…
Christopher Kuttruff
50

Powyższe osoby przeoczyły kilka rzeczy

  1. Common Lisp ma również wektory i tablice skrótów. Różnica polega na tym, że Common Lisp używa # () dla wektorów i żadnej składni dla tabel skrótów. Myślę, że schemat ma wektory

  2. Common Lisp ma makra czytnika, które pozwalają na użycie nowych nawiasów (podobnie jak Racket, potomek Scheme).

  3. Scheme i Clojure mają higieniczne makra, w przeciwieństwie do niehigienicznych makr Common Lispa

  4. Wszystkie języki są albo nowoczesne, albo mają obszerne projekty renowacji. Common Lisp zyskał obszerne biblioteki w ciągu ostatnich pięciu lat (głównie dzięki Quicklisp), Scheme ma kilka nowoczesnych wdrożeń (Racket, Chicken, Chez Scheme itp.), A Clojure powstał stosunkowo niedawno

  5. Common Lisp ma wbudowany system OO, chociaż różni się on znacznie od innych systemów OO, których mogłeś używać. Warto zauważyć, że nie jest to wymuszane - nie musisz pisać kodu OO.

  6. Języki mają nieco inne filozofie projektowania. Schemat został zaprojektowany jako minimalny dialekt do zrozumienia modelu aktora; później został użyty w pedagogice. Common Lisp został zaprojektowany, aby ujednolicić niezliczone dialekty Lisp, które wyrosły. Clojure został zaprojektowany z myślą o współbieżności. W rezultacie Scheme ma reputację minimalnego i eleganckiego, Common Lisp jest potężny i niezależny od paradygmatu (funkcjonalny, OO, cokolwiek), a Clojure faworyzuje programowanie funkcjonalne.

Cosman246
źródło
4
Rakieta nie jest implementacją schematu, poza trybami kompatybilności. Zobacz stackoverflow.com/questions/3345397
błąd
Clojure nie ma higienicznych makr, ponieważ znalazłem trudną drogę.
pyon
40

Nie zapomnij o różnicach między Lisp-1 i Lisp-2.

Schemat i Clojure to Lisp-1:
oznacza to, że zarówno nazwy zmiennych, jak i funkcji znajdują się w tej samej przestrzeni nazw.

Common Lisp to Lisp-2:
Funkcja i zmienne mają różne przestrzenie nazw (w rzeczywistości CL ma wiele przestrzeni nazw).

Paweł
źródło
-4

Gimp jest napisany w Schemacie :)

W rzeczywistości przydział oprogramowania, który niektórzy myślą, że może być napisany w C ++, został prawdopodobnie wykonany pod parasolem Lispa, ciężko jest wyłowić złote jabłka z paczki. Faktem jest, że C ++ nie zawsze był popularny, wydaje się być popularny tylko dzisiaj ze względu na historię aktualizacji. Przez mniejszą połowę stulecia C ++ nawet nie wykorzystywał wielowątkowości, to właśnie tam Python jest dziś szambo bezużytecznego, nieprzetestowanego, błędnego kodu kleju. Trochę szybciej do przodu, a teraz widzimy wzrost w programowaniu funkcjonalnym, bardziej przypomina adaptację lub śmierć. Myślę, że Java ma rację, jeśli chodzi o część adaptacyjną.

Schemat został zaprojektowany, aby uprościć język Lisp, to był jego jedyny cel, z wyjątkiem tego, że nigdy się nie przyjął. Myślę, że Clojure robi coś podobnego, co ma na celu uproszczenie schematu dla JVM nic więcej. Podobnie jak każdy inny język JVM, tylko po to, aby zwiększyć wrażenia użytkownika, tylko po to, aby uprościć pisanie schematu w krainie Java.

Meeple
źródło
2
„miał na celu uproszczenie schematu dla JVM nic więcej” „tak jak każdy inny język JVM” Tak, racja.
oskarkv
4
Gimp jest napisany w C i obsługuje Scheme, Python i Perl jako języki skryptowe.
lbalazscs