Frage Welchen Dialekt von Lisp soll ich lernen? [geschlossen]


Ich weiß, dass es ein paar verschiedene Dialekte von Lisp gibt. Nachdem ich entschieden habe, dass das Lernen von Lisp eine neue intellektuelle Erfahrung sein würde, würde ich gerne wissen, welcher Lisp-Dialekt zu lernen ist und warum.

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


76
2018-06-17 14:07


Ursprung


Antworten:


Sie möchten nach einem Gleichgewicht zwischen Einfachheit und Sauberkeit, attraktiven Funktionen und einer Plattform suchen, mit der Sie interessante und nützliche Software (für sich selbst) schreiben und als Lernwerkzeug dienen können. (Dieser letzte wird Sie weitermachen und viel länger lernen.) Hier sind einige Möglichkeiten:

  1. Planen. Wahrscheinlich der sauberste aller Dialekte. Dies ist zweifellos der Grund Der kleine Schemel wurde von LISP in Schema übersetzt. Die fünfte Standardspezifikation, R5RS, ist eine wunderbare Ausbildung an und für sich; es kann die netteste Sprache und Bibliotheksspezifikation sein, die ich je gelesen habe, ebenso wie die kürzeste, die ziemlich umfassend ist. Das PLT-Schema (jetzt Racket) Plattform enthält einen ziemlich guten Interpreter und Compiler, ist gut für das Scripting und hat auch einige visuelle Tools, die es hervorragend zum Lernen machen.

  2. Gewöhnliches Lisp. Wahrscheinlich die tragbarste und umfassendste Variante, das ist wahrscheinlich das, was Sie wollen, wenn Sie Dinge wie kommerzielle Software schreiben wollen. Der Standard definiert umfangreiche Bibliotheken, und darüber hinaus sind viele weitere verfügbar CLOS, die Ihnen wahrscheinlich mehr über OO beibringen wird, als jede OO-Sprache könnte, und einige der Compiler sind sehr gut. Zu den Nachteilen gehören einige Warzen, die Scheme nicht hat (zB ein separater Namespace für Variablen, die sich auf Funktionen beziehen), nicht so sauber und einfach (wie bei allem, was die Erweiterungen haben musste und die Kompromisse notwendig machen für große Anwendungen in der realen Welt), keine hygienischen Makros haben und die Rekursion viel weniger betonen als Schema.

  3. Clojure. Dies läuft auf der JVM, die es für Java-Entwickler auf Vordermann bringen kann. Es gibt ein paar Warzen (z. B. müssen Sie explizit nach der Tail-Call-Optimierung fragen, dies kann sich jedoch eines Tages ändern, wenn TCO zur JVM hinzugefügt wird). Die Makros sind zwar nicht hygienisch, verfügen jedoch über einige Funktionen, mit denen Sie die Variablenerfassung vermeiden können. So können Sie Variablen erfassen, wenn Sie dies wirklich wollen, und dabei weniger Gefahr laufen, dies versehentlich als in CL zu tun. Sie haben einfachen Zugriff auf alle Java-Bibliotheken. das ist wahrscheinlich eine gute Sache für den "echten" Code und ziemlich sinnlos in Bezug auf das Lernen. Es hat eine Reihe von Bibliotheken für persistente Datenstrukturen und Unterstützung für STM, die es aus einer gleichzeitigen Sichtweise sehr interessant machen; Dies macht es wahrscheinlich am besten, wenn Sie mehr über neue Methoden im Umgang mit paralleler und paralleler Programmierung erfahren möchten. Es scheint, als wäre Clojure für große Produktionsanwendungen wie Java geeignet, da es in der Lage ist, die "hässlichen Sachen" zu machen, die Sie in Produktions-Apps tun, die Sie lieber nicht machen würden und auch nicht wenn du lernst.

  4. Emacs Lisp. In Bezug auf einen LISP ist dies keines der besseren Beispiele. 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 lernen können, wie Sie den Editor besser einsetzen können. Wie viel du wirklich davon lernst, Emacs Lisp zu lernen, abgesehen davon, wie du Emacs erweitern kannst, ist für mich eine offene Frage; Ich weiß nicht, wie oft interessante Techniken wie Funktionen höherer Ordnung in Emacs Lisp wirklich verwendet werden.

2018 Aktualisierung

Es ist fast ein Jahrzehnt her, seit ich diesen Beitrag geschrieben habe und die Lisp-Familie von Sprachen scheint nun im allgemeinen Programmiererbewusstsein eine bedeutende Zugkraft zu gewinnen. Vieles davon scheint mit Clojure zu tun zu haben, das nicht nur ein eigener separater Dialekt von Lisp ist, der viele seiner eigenen guten Ideen einführt, sondern auch eine fast identische Version, die auf JavaScript abzielt und viele andere Lisps inspiriert hat Targeting auf andere Plattformen. Beispielsweise, Hy zielt auf den CPython AST und Bytecode ab und zielt zunächst auf die Interoperabilität mit Python, aber die Verwendung von Clojure-Ideen "im Zweifelsfall". (Obwohl von den letzten Commits, kann letzteres ein bisschen ändern.)

Die große Veränderung, die dies in Ihrem Entscheidungsprozess mit sich bringt, ist, dass Sie auch nach Lisps- oder Lisp-ähnlichen Sprachen Ausschau halten sollten, die für Sprachen oder Plattformen, die Sie bereits verwenden, verfügbar sind und mit ihnen interagieren Perl, Rubin, Erlang, Gehen oder auch C ++ auf Mikrocontrollern.


66
2018-06-20 02:49



Ich würde sagen, Scheme, nur wegen der Kleiner SchemelEs ist eines der unglaublichsten und lustigsten Bücher, die ich je gelesen habe.


21
2018-06-17 14:11



Ich kann Common Lisp weiterempfehlen SBCL. Diese Kombination ist schnell, kraftvoll, ausgereift und gut dokumentiert.


9
2018-06-18 09:06



Auch Clojure gewinnt in diesen Tagen viel Aufmerksamkeit und das aus gutem Grund. Tolle Datenstrukturen, zutiefst gute Nebenläufigkeitsunterstützung (schämt Scheme und CL in dieser Hinsicht) und eine großartige Gemeinschaft. Es ist auch relativ einfach, CL ist mindestens so kompliziert wie C ++.

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


8
2018-06-17 18:06



Ich bevorzuge CL, da ich objektorientierte Programmierung mag und CLOS das netteste Objektsystem ist.


5
2018-06-17 14:11



Ich habe gelernt Planen in der Schule. Es war eine großartige Lernerfahrung und ich werde nie die Grundlagen der funktionalen Programmierung vergessen. Es ist wahrscheinlich egal, welche Version von LISP du aufnimmst, solange du den Kern seiner Nützlichkeit verstehst - den statuslosen Lambda-Kalkül.

Hier ist ein interessanter Artikel über Warum MIT von Schema zu Python wechselte in seinem einführenden Programmierkurs.


5
2018-06-17 14:30



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

Schema hat zum Beispiel Fortsetzungen, und es ist gut, etwas über Scheme zu erfahren, obwohl sie in Common Lisp implementiert werden können.

Es ist wichtig, den Unterschied zwischen lexikalischem und dynamischem Bereich zu lernen, und wenn Sie sowohl Common Lisp als auch elisp lernen, werden Sie auf die Implikationen von beiden stoßen.


2
2018-06-20 01:26



LFE (Lisp Flavored Erlang) wäre nett. Sie können die Lisp-Syntax oben auf der Erlang-VM haben.


0
2017-12-08 14:42



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. Welcher ist der Beste, ist wahrscheinlich nicht so relevant wie der, der für Sie "arbeitet". Wirklich, es gibt nicht viel Unterschied. Wahrscheinlich eine Präferenz für eine über die andere vielleicht beeinflusst durch welche man zuerst lernt. (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 mit Slime mit 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.


0
2018-03-30 23:58