Welchen Lisp (Dialekt) soll ich lernen und warum?
Die Fragmentierung zwischen CL und Schema verlangsamt die Aufnahme (zumindest für mich!).
Also, gib mir bitte die "wahre Antwort"!
Ich habe versucht, Funktionsvergleiche zu lesen, und sie scheinen in der Esoterik (die ich nicht ganz verstehe) festgefahren zu sein, ob der Dialekt vollständig rekursiv ist und dergleichen. Ich hoffe, dass Sie alle (gemeinsam) die undurchsichtigen Unterschiede deutlich machen können.
Dinge, die ich mag
Gute Bibliotheksunterstützung, gute Umgebungen und Unicode-Unterstützung.
Dinge, die ich nicht mag
Flamewars. Funktionen, die am Anfang nützlich sind, aber das langfristige Lernen beeinträchtigen.
Aktualisierung
Ich habe hauptsächlich MzScheme verwendet, was mir sehr gut gefällt, sobald ich die Readline-Unterstützung erhalten habe. Ich verwende unter Unix keine grafische Benutzeroberfläche, daher schien dies eine gute Umgebungsoption für mich zu sein.
Ich bin auch sehr froh, dass Clojure ein einfach zu installierendes .deb-Paket auf Debian hat, so dass es viel einfacher ist, damit zu spielen. Dies ist ein großer Gewinn. Trotz der Feindseligkeit einiger eher leicht zu ärgernder Personen ist eine niedrige Eintrittsbarriere ein Gewinn. Ich mag es, mit dem Löffel gefüttert zu werden.
Nachdem ich viel mehr von SICP gelesen habe , verstehe ich die Probleme rund um die Schwanzrekursion viel besser.
for
undwhile
Schleifen, die Sie in imperativen Sprachen finden.Antworten:
Clojure ist ein aktiv entwickelter, moderner Dialekt von Lisp. Es basiert auf der JVM, sodass alle Java-Bibliotheken sofort verfügbar sind und daher auch Unicode-Unterstützung bieten.
Dies ist eine Alternative, nicht die einzig wahre Antwort.
quelle
recur
(die nur in einer Schwanzposition erscheinen kann), die Ihnen einen Schwanzruf gibt, mit dem Sie natürlich rekursive Funktionen ausdrücken können. Das JVM-Hindernis, über das sich jemand beschwert hat: keine nicht signierten Typen .Wenn Sie Flammenkriege vermeiden möchten und Bibliotheken genießen, wählen Sie Clojure. Es ist klein, es ist schnell und die Community ist hilfreich und nicht dogmatisch. Es ist Lisp minus der absurden Cruft der 1980er Jahre. Es hat eine BDFL und wenn Sie eine gute Idee haben, besteht eine verdammt gute Chance, dass sie in die Sprache implementiert wird.
Ich habe mit Common Lisp herumgespielt, es ist eine schöne Sache. Ich habe die ersten drei Kapitel und den Metacircular Evaluator in SICP in DrScheme abgeschlossen, und das ist auch eine schöne Sache. Natürlich werden Sie stark davon profitieren, wenn Sie diese lernen.
Aber im Laufe der Zeit habe ich kleine Sprachen in meinem Herzen. Ich werde nicht lügen, ich liebe Javascript und ich liebe C (und verdammt noch mal, wenn nicht jede Sprache einen C-Kern im Herzen hat), weil sie klein sind.
Clojure ist klein. Es ist elegant. Es ist eine Sprache für unsere Zeit.
quelle
Wählen Sie einfach eine aus und lernen Sie es. Wenn Sie die Unterschiede herausfinden, können Sie erneut wählen, wenn Sie sich beim ersten Mal schlecht entschieden haben.
quelle
Clojure ist ein großartiger LISP-Dialekt, der die funktionale Programmierung fördert. Es wird auf der JVM ausgeführt, sodass Sie Zugriff auf alle Java-Bibliotheken haben, die Sie möglicherweise gewohnt sind. Die Website bietet großartige Dokumentationen und Screencasts , die Ihnen beim Lernen helfen. Ein weiterer Vorteil ist, dass es im Gegensatz zu vielen anderen Dialekten sehr einfach zu installieren ist.
Wenn Sie nur die Konzepte verstehen möchten, ist Emacs (speziell EmacsLISP) eine weitere Alternative. Es enthält eine unglaubliche Dokumentation, Tutorials und viele Codebeispiele. Screencasts sind auch ziemlich leicht zu finden. Einer der großen Vorteile von Emacs ist, dass der Editor in LISP geschrieben ist, sodass der Editor natürlich eine sehr gute Unterstützung für das Ausführen, Bearbeiten und Debuggen von LISP bietet. Darüber hinaus können Sie den Editor erweitern, um Ihre täglichen Textbearbeitungsanforderungen zu vereinfachen, während Sie LISP lernen.
quelle
Contra Chuck, ein Vorteil von Common Lisp ist, dass es einen Standard hat, an dem Implementierungen festhalten und den sie anstreben, sodass Sie weitgehend mit SBCL (mit hervorragender Typprüfung und Inferenz) entwickeln und dann beispielsweise als ausführbare Datei bereitstellen können, die mit verknüpft ist C-Bibliotheken (mit ECL oder anderen) oder als .jar unter Verwendung von Java-Bibliotheken (mit ABCL) oder mit einem Mac oder einer Windows-nativen GUI (Clozure, beide). Common Lisp ist erstaunlich portabel über Architekturen und Implementierungen hinweg und im Laufe der Zeit portierbar, und Common Lispers bemüht sich, die Dinge mit Unterstützung der Sprache so zu halten. Zur Veranschaulichung ist eine dumme Abweichung von nicht standardisiertem Verhalten die Frage "Ist dies eine spezielle Variable?" Also habe ich es in allen von mir verwendeten Implementierungen beantwortet:
#-abcl (defun special-variable-p (symbol) #+ecl(si:specialp symbol) #+ccl(proclaimed-special-p symbol) #+sbcl(equal '(:special t) (multiple-value-list-int:info :variable :kind symbol)))
Dies reduziert sich zum Zeitpunkt des Lesens auf nichts in ABCL (das hat es bereits),
(defun special-variable-p (symbol) (si:specialp symbol))
auf ECL und so weiter. Also kann ich dies in meine .rc-Dateien einfügen und die allgemeine Funktion bei der REPL verwenden. Dies ist jedoch nicht sehr wichtig: Dies ist kein Threading oder ein Netzwerk mit unterschiedlicher Unterstützung oder eine Bibliothek für kommunizierende sequentielle Prozesse . Dieses letzte Beispiel hat nur eine#+sbcl/#-sbcl
, da es auf fünf Implementierungen ausgeführt wird. Weil es auf Code basiert, der sorgfältig portiert wurde.Was diese (und andere) Vorteile zulässt, stellt den Lernenden jedoch auch vor eine eigene Herausforderung: Common Lisp ist eine sehr große Sprache. Es ist nicht etwas, das man in ein oder zwei Wochen schlürfen kann, wie ich es bei Clojure getan habe (aber mein Clojure verfällt bereits mit den bahnbrechenden Änderungen, die eingeführt werden sollen - diese Sprache, obwohl schwer mit ihren eigenen Verdiensten, erinnerte mich im Gegensatz dazu an viel von dem, was ich an Common Lisp mag.) Sie sollten also viel von dieser Seite lesen und die HyperSpec einen Tastendruck fernhalten (für mich
M-x hyperspec RET do-symbols RET
ist die Nähe zur Bibel ausreichend.) und darüber nachdenken, ein paar Bücher zu kaufen. Ich habe Practical Common Lisp , habe gerade Let Over Lambda bekommen und werde PAIP jetzt sehr bald kaufen .Aber selbst wenn Common Lisp die wahre Antwort ist , werden Sie Ihre Zeit nicht vollständig verschwenden, indem Sie nur eine täuschend auffällige Alternative auswählen (- "trügerisch", weil der alltägliche CL Ihnen nicht alles zeigt, was seine Makros können, und das auch hat mehr Arten von Makros als jeder andere . Der übliche Vergleich ist zwischen schlechtem CL und syntaxoptimierter Alternative X). Sie werden immer noch die Grundlagen lernen, Sie können immer noch viel von dem verwenden, was Sie in SICP, On Lisp, The Little Schemer usw. lesen können . Ein Lisp, selbst das falsche Lisp, ist immer noch besser als ein Nicht-Lisp. (Aber Sie werden einen Teil Ihrer Zeit damit verbringen, Teile des richtigen Lisp schlecht in das falsche Lisp zu implementieren. Meta-Greenspun.)
quelle
Das größte Problem von Lisp ist, dass es keinen übergeordneten Standard gibt, an den sich jeder hält. Sie müssen nicht nur zwischen Common Lisp und Scheme wählen. Sie müssen zwischen mehreren inkompatiblen Implementierungen von Common Lisp und mehreren inkompatiblen Implementierungen von Scheme sowie anderen kleinen Dingen wie Arc und Clojure wählen.
Ich würde empfehlen, mit MzScheme zu beginnen . Es ist beliebt, es wird aktiv entwickelt, es hat viele Bibliotheken, die die Funktionen einer modernen Programmierumgebung bieten, und das Schema ist etwas einfacher (nicht besser, nur einfacher) als Common Lisp.
quelle
Lerne elisp, damit du Emacs erweitern kannst.
quelle
Geh mit Clojure. Es ist eine erstaunliche Sprache mit vollem Zugriff auf jede Java-Bibliothek. Es befindet sich seit etwas mehr als 2 Jahren in der Entwicklung und hat bereits 3 IDE-Plugins in der Entwicklung und ein Buch, das im April darüber veröffentlicht wird. Es ist sehr schnell, sehr elegant und schön. Mit Clojure kann man nichts falsch machen.
quelle
Für mich ist die grundlegende Theorie des Schemas weitaus überzeugender. PLTScheme ist bei weitem das am aktivsten entwickelte LISP, das ich gefunden habe. Leider gibt es eine Zunahme des Tippens, die die Schönheit von Lisp verdeckt.
Ich würde gerne sehen, dass so etwas wie arc erfolgreich ist, aber es scheint unwahrscheinlich.
quelle
Schauen Sie sich IronScheme an .
quelle
Vermutung: Wenn Sie Ihr erstes Lisp lernen, lernen Sie keines, das Sie am Ende für die Endentwicklung verwenden werden.
Lemma: lerne Arc. Es sind all die "schwer zu fassenden" Dinge in Lisp - Closures, Makros, Fortsetzungen, ohne die Java-Interop-Komplexität von Clojure, die Namespace-Verwirrung von CL oder die Namensfragmentierung von Scheme. Wenn Sie engagiert sind, können Sie all diese Dinge an einem Wochenende lernen. Wenn Sie scharf und engagiert sind, in einer Nacht.
Und es wird das Lernen aller anderen Lisps viel einfacher machen.
quelle
Ich kenne Lisp nicht, aber hier ist der Grund, warum ich das PLT-Programm für eine gute Wahl halte:
Wirklich gute Dokumentationen
http://download.plt-scheme.org/doc/html/
DrScheme
DrScheme ist eine erstaunliche Programmierumgebung, die mit Compiler, Stepper, Syntaxprüfern, REPL und unzähligen Sprachunterstützungen ausgestattet ist und erweiterbar ist. So macht die gesamte Erfahrung Spaß. Siehe einige Screenshots
Gute Unterstützung von der Community.
Die Community ist sehr begeistert von ihrer Sprache und auch sehr unterstützend. Bei Fragen stehen Mailinglisten, Gruppen und Foren zur Verfügung. Auch die Autoren sind sehr sehr zugänglich.
Continuing Research
PLT ist sehr aktiv und entwickelt sein Tool immer besser. Von den Labors können Sie viele Innovationen erwarten. z.B. Ich bin ziemlich aufgeregt darüber: http://blog.plt-scheme.org/2009/05/typed-scheme-20.html
Kostenlose Bücher und interessante Tutorials für den Einstieg.
http://www.htdp.org/
http://world.cs.brown.edu/
Gute Module und umfangreiche Bibliotheken.
http://www.cs.utah.edu/plt/develop/
http://planet.plt-scheme.org/ siehe auch Dokumente
Wenn Sie Scheme lernen, probieren Sie DrScheme aus .
quelle
Weißt du ... Als ich mich für Lisp interessierte, dachte ich auch, ich müsste mich entscheiden. Nachdem ich viel gelesen und gefragt hatte, entschied ich mich für Common Lisp. Nicht weil es absolut "besser" als Scheme ist, sondern weil es Funktionen hatte, von denen ich wusste, dass ich sie wahrscheinlich in den nächsten 2-3 Jahren in meinen Projekten verwenden würde:
Wenn ich Sie wäre, würde ich anfangen, ein kleines Stück jeder Sprache zu lernen und herausfinden, welche relativen Stärken und Schwächen jede Sprache hat (ich meine, diejenigen, die sich auf das beziehen, was Sie am häufigsten brauchen / wollen) du könnte ich eins auswählen. Vielleicht finden Sie später heraus, dass Sie den anderen auch lernen werden (mir passiert - ich musste nach einem Jahr Common Lisp mehr lernen).
Was Arc, Clojure und Lush betrifft, und kenne diese nicht. Ich nehme an, dass das gleiche Argument auch für sie gelten könnte ... Die Gründe, warum ich nicht zu viel in sie investieren wollte, waren: Arc scheint für numerische Berechnungen nicht interessant zu sein, und P. Graham scheint von der Codegröße (bis) besessen zu sein der Punkt, seinen Code unlesbar zu machen); Clojure scheint nett zu sein, aber ich mag die JVM nicht. Und üppig ... Nun, abgesehen von der Verwendung des dynamischen Bereichs sind die kompilierten und interpretierten Versionen der Sprache sehr unterschiedlich - und Sie können keine rekursiven Funktionen kompilieren. Für mich war es entweder Schema oder Common Lisp.
quelle
binding
.Ich denke, Sie wollen entweder Common Lisp oder PLT Scheme.
Ersteres bietet viel Freiheit und Kraft (die Sie zunächst überwältigen könnten), und letzteres enthält eine Reihe von Bibliotheken, passende Tutorials und eine gut integrierte IDE.
quelle
Wählen Sie etwas anderes als Clojure, machen Sie mit, und Sie können später besser bewerten.
Sie haben diese Frage so formuliert, dass Lisp das beste Medium zum Erlernen von Lisp ist, und für mich muss dies ein Lisp enthalten, das aus Grundelementen niedriger Ebene aufgebaut ist, während große Teile von Clojure in Java geschrieben sind.
Wenn Sie diese Frage als das beste Lisp formuliert haben, in dem Sie ein neues Projekt starten können, ist Clojure möglicherweise die beste Wahl.
quelle
Ich bin ein Fan von Scheme, aber es ist mehr als 10 Jahre her, seit ich etwas mit Scheme gemacht habe.
wie andere gesagt haben - wählen Sie einfach eine und gehen Sie.
quelle
Es gibt dort nur sehr wenige echte Möglichkeiten, entweder SBCL, Clojure oder PLTScheme.
quelle