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?
Antworten:
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:
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.
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.
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.
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 .
quelle
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.
quelle
Ich kann Common Lisp auf SBCL empfehlen . Diese Kombination ist schnell, leistungsstark, ausgereift und gut dokumentiert.
quelle
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.
quelle
Ich bevorzuge CL, da ich objektorientierte Programmierung mag und CLOS das schönste Objektsystem ist, das es gibt.
quelle
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 .
quelle
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.
quelle
LFE (Lisp Flavored Erlang) wäre schön. Sie können die Lisp-Syntax über der Erlang-VM haben.
quelle
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.
quelle