it-swarm.com.de

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

Ich weiß, dass es sich um Dialekte der gleichen Sprachfamilie handelt, die LISP heißt, aber was genau sind die Unterschiede? Könnten Sie, wenn möglich, einen Überblick über Themen wie Syntax, Eigenschaften, Funktionen und Ressourcen geben?.

111
MaiaVictor

Sie alle haben viel gemeinsam:

  • Dynamische Sprachen
  • stark getippt
  • Kompiliert
  • LISP-artige Syntax, d. H. 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 anderen Paradigmen Rechnung tragen
  • Betonung der interaktiven Entwicklung mit einem REPL (d. H. Sie entwickeln interaktiv in einer laufenden Instanz des Codes)

Gemeinsame Merkmale von LISP:

Clojure Besonderheiten:

  • Größtes Bibliotheksökosystem, da Sie direkt beliebige Java Bibliotheken verwenden können
  • Vektoren [] und Karten {} wird zusätzlich zu den Standardlisten als Standard verwendet () - 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 der Unveränderlichkeit und der faulen funktionalen Programmierung, etwas inspiriert von Haskell
  • Starke Parallelitätsfähigkeiten, die vom Software-Transaktionsspeicher auf Sprachebene unterstützt werden (sehenswert: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey )

Systemspezifische Merkmale:

  • Wohl das einfachste und am einfachsten zu erlernende LISP
  • Hygienische Makros (siehe http://en.wikipedia.org/wiki/Hygienic_macro ) - vermeiden auf elegante Weise die Probleme mit der versehentlichen Symbolerfassung bei Makroerweiterungen
94
mikera

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. Das Schema enthält Vektoren, glaube ich

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

  3. Schema und Clojure haben hygienische Makros im Gegensatz zu den unhygienischen Makros 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), Schema hat einige moderne Implementierungen (Racket-, Chicken-, Chez-Schema usw.), und Clojure wurde vor relativ kurzer Zeit erstellt

  5. Common LISP hat ein eingebautes OO System, obwohl es sich sehr von anderen OO Systemen unterscheidet, die Sie möglicherweise verwendet haben. Insbesondere wird es nicht erzwungen - Sie nicht müssen schreiben OO code.

  6. Die Sprachen haben etwas andere Designphilosophien. Das Schema wurde als Minimal-Dialekt zum Verständnis des Actor-Modells entworfen. es wurde später für die Pädagogik verwendet. Common LISP wurde entwickelt, um die unzähligen LISP-Dialekte, die entstanden waren, zu vereinen. Clojure wurde für die gleichzeitige Verwendung entwickelt. Infolgedessen gilt Scheme als minimal und elegant, Common LISP als leistungsfähig und paradigmenunabhängig (funktional, OO, was auch immer) und Clojure als Favorit der funktionalen Programmierung.

47
Cosman246

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 in demselben Namespace befinden.

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

36
paul