Was sind die Unterschiede zwischen Clojure, Scheme / Racket und Common Lisp?

120

Ich weiß, dass es sich um Dialekte derselben Sprachfamilie handelt, die Lisp genannt wird, aber was genau sind die Unterschiede? Könnten Sie nach Möglichkeit einen Überblick über Themen wie Syntax, Merkmale, Funktionen und Ressourcen geben?

MaiaVictor
quelle
3
Ich bitte um einen allgemeineren Überblick über die Unterschiede, da ich der Meinung bin, dass diese Frage für viele andere Menschen nützlich sein kann. Tut mir leid, wenn sie missbräuchlich klingt.
MaiaVictor
4
Ich bin immer verwirrt darüber, welcher Beitrag wohin gehen soll. Dies ist eine Diskussion über Werkzeuge. Ist es also eine Frage für hier oder für Programmierer? Logischerweise würde ich sagen, verschieben Sie es zu Programmierern, weil es nicht darum geht, ein bestimmtes Problem zu lösen, aber es ist meiner Meinung nach ein guter Beitrag mit einer guten Antwort.
Octopusgrabbus
1
@octopusgrabbus: Die Frage ist viel zu weit gefasst. Der Vergleich von drei Programmiersprachen in Bezug auf Syntax, Merkmale, Funktionen und Ressourcen kann ein Buch oder eine Website problemlos füllen. Stackoverflow ist für Leute mit Programmierproblemen gedacht, es ist keine Enzyklopädie (Wikipedia), es ist kein allgemeines Diskussionsforum (Usenet), es ist keine Sprachvergleichsseite ( rosettacode.org ). Es ist am besten für echte Programmierprobleme geeignet, bei denen die Frage Code enthält und die Antworten auch Code enthalten. Plus: Machen Sie keine Probleme, nur weil sich jemand langweilt oder das ein Hobby ist.
Rainer Joswig
3
Nur weil die Frage weit gefasst ist, heißt das nicht, dass sie nicht hierher gehört. Es ist eine vollkommen klare Frage, und es ist sicherlich eine "echte Programmierfrage". StackOverflow ist in erster Linie als [googleable] Community-Ressource gedacht, um Wissen über das Programmieren im Q & A-Format auszutauschen.
Dan Burton
@RainerJoswig, ich könnte einfach alles schreiben, was ich in den letzten Tagen, in denen ich sie gelernt habe, über diese Sprachen gelernt habe, aber das würde den Thread groß machen. Das ist wirklich schlimm, wenn Sie feststellen, dass die Leute so einen kurzen Satz googeln und die Antwort nicht bekommen können, weil ein großer Text sie daran hindert, schnell zu verstehen, was gefragt wird. Auf diese Weise wird sichergestellt, dass viel mehr Menschen durch eine gute Antwort unterstützt werden.
MaiaVictor

Antworten:

103

Sie alle haben viel gemeinsam:

  • Dynamische Sprachen
  • Stark getippt
  • Zusammengestellt
  • Syntax im Lisp-Stil, dh Code wird als Lisp-Datenstruktur (Formulare) geschrieben, wobei das häufigste Muster Funktionsaufrufe sind wie: (function-name arg1 arg2)
  • Leistungsstarke Makrosysteme, mit denen Sie Code als Daten behandeln und zur Laufzeit beliebigen Code generieren können (häufig verwendet, um entweder die Sprache mit neuer Syntax zu erweitern oder DSLs zu erstellen).
  • Wird häufig im funktionalen Programmierstil verwendet, kann jedoch auch andere Paradigmen berücksichtigen
  • Schwerpunkt in der interaktiven Entwicklung mit einer REPL (dh Sie entwickeln interaktiv in einer laufenden Instanz des Codes)

Gemeinsame Lisp-Besonderheiten:

Clojure Besonderheiten:

  • Größtes Bibliotheks-Ökosystem, da Sie alle Java-Bibliotheken direkt verwenden können
  • Vektoren []und Karten, {}die zusätzlich zu den Standardlisten als Standard verwendet werden ()- zusätzlich zur allgemeinen Nützlichkeit von Vektoren und Karten glauben einige, dass dies eine Innovation ist, die die Lesbarkeit allgemein verbessert
  • Stärkere Betonung auf Unveränderlichkeit und fauler funktionaler Programmierung, etwas inspiriert von Haskell
  • Starke Parallelitätsfunktionen, die vom Software-Transaktionsspeicher auf Sprachebene unterstützt werden (sehenswert: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey )

Besonderheiten des Schemas:

  • Wohl das einfachste und am einfachsten zu erlernende Lisp
  • Hygienische Makros (siehe http://en.wikipedia.org/wiki/Hygienic_macro ) - vermeidet elegant die Probleme mit der versehentlichen Symbolerfassung bei Makroerweiterungen
mikera
quelle
11
das ist gut, aber vielleicht sollten Sie erwähnen, dass Schläger mehr als "nur" Schema ist; Es ist ein System, das mehrere (aber verwandte) Sprachen unterstützt (Sie können sogar Ihre eigenen definieren). Außerdem hat Clojure verschiedene Möglichkeiten, eine oo-ähnliche Programmierung durchzuführen (sowohl ein Mehrfachversand-Ansatz, der vage dem Schließen ähnelt, als auch etwas, das Java näher kommt und auf dem JVM effizienter ist). und das Schema geht in Richtung mehr Standardbibliotheken (die auch oo enthalten) mit r6rs, die Racket unterstützt.
Andrew Cooke
2
"Stark typisierte dynamische Sprache" ist Marketing. In diesem Sinne ist sogar Python stark typisiert.
Ron
16
@ron: Python ist stark typisiert, genau wie Lisp (im Gegensatz zu Javascript oder VB). Sie denken stattdessen an "statische Typisierung" und "dynamische Typisierung". Alle Sorten finden Sie unter en.wikipedia.org/wiki/Type_system . Aber ja, es ist Marketing
Nas Banov
2
Ich würde auch denken, dass Racket gut wäre, um zu dieser Antwort hinzugefügt zu werden. Ich würde denken, dass Racket aufgrund der Community und des Fokus der Sprache noch einfacher zu lernen ist als Scheme. Racket (früher PLT-Schema genannt) ist eine universelle Programmiersprache mit mehreren Paradigmen in der Lisp / Scheme-Familie. Eines seiner Designziele ist es, als Plattform für die Erstellung, das Design und die Implementierung von Sprachen zu dienen.
Mtelesha
Clojure hat hygienische Makros. Weitere Infos hier: xivilization.net/~marek/blog/2013/09/17/…
Christopher Kuttruff
50

Die Leute oben haben ein paar Dinge verpasst

  1. Common Lisp hat auch Vektoren und Hash-Tabellen. Der Unterschied besteht darin, dass Common Lisp # () für Vektoren und keine Syntax für Hash-Tabellen verwendet. Schema hat Vektoren, glaube ich

  2. Common Lisp verfügt über Lesermakros, mit denen Sie neue Klammern verwenden können (ebenso wie Racket, ein Nachkomme von Scheme).

  3. Scheme und Clojure haben hygienische Makros im Gegensatz zu den unhygienischen von Common Lisp

  4. Alle Sprachen sind entweder modern oder haben umfangreiche Renovierungsprojekte. Common Lisp hat in den letzten fünf Jahren umfangreiche Bibliotheken erhalten (hauptsächlich dank Quicklisp), Scheme hat einige moderne Implementierungen (Racket, Chicken, Chez Scheme usw.) und Clojure wurde vor relativ kurzer Zeit erstellt

  5. Common Lisp verfügt über ein integriertes OO-System, das sich jedoch erheblich von anderen OO-Systemen unterscheidet, die Sie möglicherweise verwendet haben. Bemerkenswert ist , wird es nicht durchgesetzt - Sie müssen nicht haben zu OO - Code zu schreiben.

  6. Die Sprachen haben etwas andere Designphilosophien. Das Schema wurde als minimaler Dialekt zum Verständnis des Akteurmodells konzipiert. es wurde später für die Pädagogik verwendet. Common Lisp wurde entwickelt, um die unzähligen Lisp-Dialekte zu vereinen, die entstanden waren. Clojure wurde für Parallelität entwickelt. Infolgedessen hat Scheme den Ruf, minimal und elegant zu sein, Common Lisp ist mächtig und paradigmenunabhängig (funktional, OO, was auch immer) und Clojure bevorzugt funktionale Programmierung.

Cosman246
quelle
4
Racket ist keine Implementierung von Scheme, außer bei Kompatibilitätsmodi. Siehe stackoverflow.com/questions/3345397
Fehler
Clojure hat keine hygienischen Makros, wie ich den schwierigen Weg gefunden habe.
Pyon
40

Vergessen Sie nicht die Unterschiede zwischen Lisp-1 und Lisp-2.

Schema und Clojure sind Lisp-1:
Das bedeutet, dass sich sowohl Variablen- als auch Funktionsnamen im selben Namespace befinden.

Common Lisp ist Lisp-2:
Funktion und Variablen haben unterschiedliche Namespaces (tatsächlich hat CL viele Namespaces).

paul
quelle
-4

Gimp ist in Schema geschrieben :)

Tatsächlich wurde eine Menge Software, von der einige Leute glauben, dass sie in C ++ geschrieben ist, wahrscheinlich unter dem Dach von Lisp erstellt. Es ist schwierig, die goldenen Äpfel aus dem Haufen herauszusuchen. Tatsache ist, dass C ++ nicht immer populär war, es scheint nur heute wegen einer Geschichte von Updates populär zu sein. In der zweiten Hälfte des Jahrhunderts nutzte C ++ nicht einmal Multithreading, sondern Python ist heute eine Sackgasse nutzlosen, nicht getesteten Buggy-Klebercodes. Ein wenig schneller und jetzt sehen wir einen Anstieg der funktionalen Programmierung, es ist eher wie anpassen oder sterben. Ich denke, Java hat es richtig gemacht, was den Anpassungsteil betrifft.

Das Schema wurde entwickelt, um die Lisp-Sprache zu vereinfachen. Dies war die einzige Absicht, außer dass sie sich nie wirklich durchsetzte. Ich denke, Clojure macht etwas Ähnliches, um das Schema für die JVM zu vereinfachen, nichts weiter. Es ist genau wie jede andere JVM-Sprache nur dazu da, die Benutzererfahrung zu verbessern, nur um das Schreiben von Boilerplates in Java Land zu vereinfachen.

Meeple
quelle
2
"soll das Schema für die JVM nicht mehr vereinfachen" "genau wie jede andere JVM-Sprache" Ja, richtig.
oskarkv
4
Gimp ist in C geschrieben und unterstützt Scheme, Python und Perl als Skriptsprachen.
lbalazscs