Welchen Lisp-Dialekt soll ich lernen? [geschlossen]


89

Ich weiß, dass es einige verschiedene Dialekte von Lisp gibt. Nachdem ich entschieden habe, dass das Erlernen von Lisp eine neue intellektuelle Erfahrung sein würde, würde ich gerne wissen, welchen Lisp-Dialekt ich lernen soll und warum.

Gibt es eine, die beliebter ist als die anderen? Ist einer von ihnen "vollständiger" als in, besser dokumentiert und unterstützt? Was sind die Vor- und Nachteile dieses Dialekts?



Ich habe danach gesucht, bevor ich das gestellt habe, aber die Art der Frage hat sich während der Eingabe geändert. Ich werde dafür sorgen, das Rad nicht neu zu erfinden.
Humphrey Bogart

Was ist der Unterschied zwischen dieser Frage und der Frage, die Greg oben erwähnt hat?
cjs

2
Ich denke, was er zu sagen versuchte, war: Als ich meine Frage zum ersten Mal in meinem Kopf formulierte, war sie völlig anders als die aktuelle, und das Betrachten der Fragen in der zugehörigen Suche ergab keine, die zu dem passten, was er wollte Fragen. Aber als er die Frage abtippte, hatte sie sich geändert und war somit in der aktuellen Form, die zuvor gestellt wurde, bei SO angekommen.
J. Polfer

Antworten:


76

Sie möchten ein Gleichgewicht zwischen Einfachheit und Sauberkeit, attraktiven Funktionen und einer Plattform suchen, auf der Sie interessante und nützliche Software (für sich selbst) schreiben und als Lernwerkzeug dienen können. (Letzteres wird Sie viel länger am Laufen halten und lernen.) Hier sind einige Möglichkeiten:

  1. Planen. Wahrscheinlich der sauberste aller Dialekte. Dies ist kein Zweifel, warum The Little Schemer von LISP in Scheme übersetzt wurde. Die fünfte Standardspezifikation des Schemas, R5RS , ist eine wunderbare Ausbildung für sich; Es ist möglicherweise die schönste Sprach- und Bibliotheksspezifikation, die ich je gelesen habe, sowie die kürzeste, die einigermaßen umfassend ist. Die PLT Scheme- Plattform (jetzt Racket) enthält einen recht anständigen Interpreter und Compiler, eignet sich gut für Skripte und verfügt über einige visuelle Tools, die sie hervorragend zum Lernen eignen.

  2. Common Lisp. Dies ist wahrscheinlich die portabelste und umfassendste Variante. Dies ist höchstwahrscheinlich das, was Sie möchten, wenn Sie Dinge wie kommerzielle Software schreiben möchten. Der Standard definiert umfangreiche Bibliotheken, und darüber hinaus sind viele weitere verfügbar. Er verfügt über CLOS , mit dem Sie wahrscheinlich mehr über OO lernen können als jede andere OO-Sprache, und einige der Compiler sind sehr gut. Zu den Nachteilen zählen einige Warzen, die das Schema nicht hat (z. B. einen separaten Namespace für Variablen, die sich auf Funktionen beziehen), die nicht so sauber und einfach sind (wie dies bei allem der Fall ist, das die Erweiterungen haben und die erforderlichen Kompromisse eingehen musste) für große Anwendungen in der realen Welt), die keine hygienischen Makros haben und die Rekursion viel weniger betonen als das Schema.

  3. Clojure.Dies läuft auf der JVM, was Java-Entwicklern möglicherweise einen Vorsprung verschafft. Es hat ein paar Warzen (z. B. müssen Sie explizit nach einer Tail-Call-Optimierung fragen, obwohl sich dies eines Tages ändern kann, wenn der JVM TCO hinzugefügt werden). Die Makros sind zwar nicht hygienisch, verfügen jedoch über einige Funktionen, mit denen Sie die Erfassung von Variablen vermeiden können. Sie können also Variablen erfassen, wenn Sie dies wirklich möchten, und haben dabei ein geringeres Risiko, dies versehentlich zu tun als in CL. Sie haben einfachen Zugriff auf alle Java-Bibliotheken. Das ist wahrscheinlich eine gute Sache für Code aus der "realen Welt" und in Bezug auf das Lernen ziemlich sinnlos. Es verfügt über eine Reihe von Bibliotheken für persistente Datenstrukturen und Unterstützung für STM, die es aus gleichzeitiger Sicht sehr interessant machen. Dies macht es wahrscheinlich zu Ihrer besten Wahl, wenn Sie ' Sie möchten mehr über neue Methoden für den Umgang mit gleichzeitiger und paralleler Programmierung erfahren. Es scheint, als ob Clojure für große Produktionsanwendungen genauso brauchbar ist wie Java, in dem Sinne, dass es die Fähigkeit haben wird, die "hässlichen Dinge" zu tun, die Sie in Produktionsanwendungen tun, die Sie lieber nicht tun und nicht tun würden wenn du lernst.

  4. Emacs Lisp. In Bezug auf ein LISP ist dies nicht eines der besseren Beispiele da draußen. Einer der größten Fehler ist das dynamische Scoping, aber es gibt viele andere. Wenn Sie jedoch ein Emacs-Benutzer sind, ist dies möglicherweise das leistungsstärkste Tool, mit dem Sie die Verwendung des Editors verbessern können. Wie viel Sie wirklich durch das Erlernen von Emacs Lisp lernen würden, über die Erweiterung von Emacs hinaus, ist für mich jedoch eine offene Frage. Ich weiß nicht, wie oft interessante Techniken wie Funktionen höherer Ordnung in Emacs Lisp wirklich verwendet werden.

Update 2018

Es ist fast ein Jahrzehnt her, seit ich diesen Beitrag geschrieben habe, und die Lisp-Sprachfamilie scheint nun im allgemeinen Programmiererbewusstsein an Bedeutung zu gewinnen. Vieles davon scheint mit Clojure zu tun zu haben, das nicht nur zu einem eigenständigen Dialekt von Lisp geworden ist und viele seiner eigenen guten Ideen einführt, sondern jetzt auch eine nahezu identische Version für JavaScript hat und viele andere Lisps inspiriert hat auf andere Plattformen abzielen. Zum Beispiel zielt Hy auf den CPython-AST und den Bytecode ab, wobei zunächst die Interoperabilität mit Python angestrebt wird, Clojure-Ideen jedoch "im Zweifelsfall" verwendet werden. (Obwohl sich die letzten Commits geändert haben, kann sich letzteres etwas ändern.)

Die große Änderung in Ihrem Entscheidungsprozess besteht darin, dass Sie sich auch die verfügbaren Lisps- oder Lisp-ähnlichen Sprachen ansehen und mit Sprachen oder Plattformen zusammenarbeiten sollten, die Sie bereits verwenden, sei es Perl , Ruby , Erlang , Go oder sogar C ++ auf Mikrocontrollern .


3
Separate Namespaces zu haben ist keine Warze, sondern nur eine andere Designentscheidung. Beachten Sie, dass es bereits mehrere andere Namespaces im Schema gibt, sodass die Debatte eher Lisp-5 gegen Lisp-6 ist. Abgesehen von der Bequemlichkeit, dass ich in CL eine Liste "Liste" und ein Auto "Auto" nennen kann, ist das Makrosystem viel praktischer und nützlicher, weil der Compiler die Dinge nicht so leicht verwirrt.
Svante

Clojure verfügt nicht über eine Tail-Call-Optimierung und kann dies auch nicht, da der JVM-Bytecode dies nicht unterstützt. Alles, was es hat, ist eine "wiederkehrende" Sonderform, die die aktuelle Funktion selbst rekursiv macht.
Svante

3
Curt: Ich würde argumentieren, dass Clojure am portabelsten ist, da es auf der Java-VM ausgeführt wird.
Justinhj

1
Das weiß ich nicht. Wenn Sie kleine und eingebettete Geräte (wie Telefone und Smartcards) ausschließen, auf denen ohnehin kein unverändertes Desktop- / Serverprogramm ausgeführt wird, läuft elisp mit Sicherheit auf viel mehr CPUs und Plattformen als die JVM.
cjs

1
Ich bin absolut anderer Meinung. Die Rekursion führt tendenziell zu Code, der a) reiner, b) leichter zu überprüfen und c) wahrscheinlicher korrekt ist. Im Detail: a) es neigt weniger dazu, weniger Variablen außerhalb der Funktion zu berühren; b) ein induktiver Beweis neigt dazu, die rekursive Funktion auf natürliche Weise zu verlassen, während Sie bei Schleifen Schleifeninvarianten usw. überprüfen müssen; c) Zuverlässigkeit kommt von a) und dass Sie dazu neigen, auf eine Weise zum Code gedrängt zu werden, die Sie natürlich (vielleicht informell) dazu bringt, den induktiven Beweis von b) zu erbringen.
cjs

22

Ich würde Scheme sagen, nur wegen des kleinen Schemers , der eines der umwerfendsten, aber äußerst harten Bücher ist, die ich je zu lesen versucht habe.


15
SICP nicht vergessen! mitpress.mit.edu/sicp . Dies ist eine klassische Lektüre.
Joris Timmermans

7
Es gab zwei oder drei Ausgaben von The Little Lisper, bevor The Little Schemer als Übersetzung herauskam.
cjs

9

Ich kann Common Lisp auf SBCL empfehlen . Diese Kombination ist schnell, leistungsstark, ausgereift und gut dokumentiert.


8

Auch Clojure gewinnt heutzutage aus gutem Grund an Aufmerksamkeit. Großartige Datenstrukturen, eine zutiefst gute Unterstützung für Parallelität (was Scheme und CL in dieser Hinsicht beschämt) und eine großartige Community. Es ist auch relativ einfach, CL ist mindestens so kompliziert wie C ++.

Das soll nicht heißen, dass ich CL oder Scheme nicht mag. Ich habe Schema mit SICP gelernt. Und CL brachte mich nach Clojure. Es hängt alles von Ihren Zielen ab, nehme ich an. Wenn Sie ein Lisp lernen möchten, das immens praktisch ist, entscheiden Sie sich für Clojure. Ansonsten sind CL oder Scheme beide großartig.


Dies scheint zu implizieren, dass weder CL noch Schema "immens praktisch" sind, während sie tatsächlich ziemlich praktisch sind. Vor allem wurde der CL Standard geboren aus praktischen Erwägungen heraus.
Leslie P. Polzer

2
Die Programmiersprachenlandschaft hat sich seit 1994 geändert. Ich weiß nicht, wie sich der CL-Standard ändern / weiterentwickeln wird, um dem Rechnung zu tragen, was seitdem gelernt wurde. Die Welt schlingert vorwärts und soweit ich das beurteilen kann, steht CL still. Ich mag CL, Clojure hat noch einen weiten Weg vor sich, um sich seiner Macht zu nähern, aber ich sehe nicht, wie sich CL entwickeln wird - wenn Sie standardisierte Sprachen verwenden, muss ein Evolutionspfad offensichtlich sein. Ohne sie ist eine Sprache sehr wahrscheinlich keine praktische Wahl.
dnolen

4
CL hat sich weiterentwickelt und entwickelt sich durch viele sehr nützliche Bibliotheken. Die Basissprache war bereits 1994 mächtiger als alle "modernen" Sprachen heute.
Svante

5

Ich bevorzuge CL, da ich objektorientierte Programmierung mag und CLOS das schönste Objektsystem ist, das es gibt.


5
Apropos CL, ich würde entweder ClozureCL oder SBCL empfehlen. Beide sind Open Source, gut dokumentiert, ausgereift, plattformübergreifend und bieten wichtige nicht standardmäßige Funktionen wie Multithreading.
Daniel Dickison

5

Ich habe Scheme in der Schule gelernt . Es war eine großartige Lernerfahrung und ich werde die Grundlagen der funktionalen Programmierung nie vergessen. Es spielt wahrscheinlich keine Rolle, welche Version von LISP Sie verwenden, solange Sie den Kern seiner Nützlichkeit verstehen - den zustandslosen Lambda-Kalkül.

Hier ist ein interessanter Artikel darüber, warum MIT in seinem Einführungskurs zum Programmieren von Scheme zu Python gewechselt ist .


3

Ich würde sie alle sagen, zumindest zuerst. Irgendwann werden Sie wahrscheinlich eine Vorliebe für Scheme oder Common Lisp entwickeln, aber beide haben genug Unterschiede, dass es am besten ist, alles in den Griff zu bekommen, was da draußen ist.

Das Schema hat beispielsweise Fortsetzungen, und es ist gut, sich mit denen im Schema vertraut zu machen, obwohl sie in Common Lisp implementiert werden können.

Es ist wichtig, den Unterschied zwischen lexikalischem und dynamischem Umfang zu lernen. Wenn Sie sowohl Common Lisp als auch Elisp lernen, werden Sie auf die Auswirkungen beider stoßen.


0

LFE (Lisp Flavored Erlang) wäre schön. Sie können die Lisp-Syntax über der Erlang-VM haben.


0

War zunächst eine Art "geladene" Frage, aber OP wusste wahrscheinlich nichts davon. Im Allgemeinen sind Common- und Scheme-Lisper wie PC- und Apple-Computer- "Menschen", sie mischen sich nicht. Welches am besten ist, ist wahrscheinlich nicht so relevant wie welches für Sie "funktioniert". Wirklich, es gibt nicht so viel Unterschied. Wahrscheinlich wird eine Präferenz für eine gegenüber der anderen davon beeinflusst, welche Sie zuerst lernen. (Für mich sollte eine leere Liste "nichts" sein, in CL als NIL bekannt, und das macht mich zu einem Common Lisper.) Ich mag die Integration von SBCL in Slime mithilfe von EMACS, aber SBCL ist nicht jedermanns Sache. Zum einen ist SBCL sehr streng. Wenn Sie einfach nur "Spaß haben" möchten, ist der GNU-Clisp einfach und für praktisch jede Plattform verfügbar.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.