Welches Lisp soll ich lernen? [geschlossen]


71

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

  1. 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.

  2. 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.

  3. Nachdem ich viel mehr von SICP gelesen habe , verstehe ich die Probleme rund um die Schwanzrekursion viel besser.


Ein Deb-Paket, um es zu installieren? Ich hoffe auf jeden Fall, dass es sonst die Version 1.0 ist. Wahrscheinlich verwenden Sie etwas Altes. Ich bekomme nichts von einem SVN und die Eingabe von "Ant Build" schafft eine hohe Eintrittsbarriere. Ganz zu schweigen davon, dass es seit der Version 1.0 keinen Grund gibt, etwas von der SVN zu entfernen, es sei denn, Sie möchten die Blutungskante haben.
Rayne

Sie können gerne selbst entscheiden, was eine Eintrittsbarriere ist. Ich arbeite nicht in Java und kenne das Build-System nicht. Ich habe keine Ameise installiert. Wie sich herausstellt, ist es 1.0.0. Ich weiß nicht, warum Sie diesem Thread so genau folgen oder warum Sie mich und meine Meinungen weiterhin beleidigen wollen. Es macht Clojure für Sie als Anwalt nicht attraktiver.
Gregg Lind

6
Wenn ich über ein Jahr später auf diesen Thread zurückkomme, kann ich sehen, wie ich hier wie ein Schwanz klang. Ich möchte mich dafür entschuldigen, dass ich so klinge. Ich denke, wir sind nur verschiedene Arten von Programmierern. Ich denke auch, dass Sie feststellen werden, dass sich die Clojure-Situation erheblich verbessert hat, da Dinge wie Leiningen, Cake und Cljr erstellt wurden. Es tut mir wieder leid, dass ich so beleidigend klinge. Ich versichere Ihnen, meine Absichten waren rein.
Rayne

Rayne, es braucht eine Menge Zeug, um so etwas zuzugeben! Ich bin mir nicht sicher, wie unterschiedlich wir sind, aber meine Zeit ist begrenzt, und wenn es darauf ankommt, wenn eine Technologie freundlicher ist, werde ich sie eher verwenden.
Gregg Lind

Schwanzrekursion "esoterica"? Es ist kein Fremder als die forund whileSchleifen, die Sie in imperativen Sprachen finden.
new123456

Antworten:


64

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.


10
aber es wird hoffnungslos durch diese JVM behindert. Wie kann man LISP als nicht schwanzrekursive Sprache bezeichnen?
Javier

3
Common Lisp ist auch nicht rekursiv. Ich bin damit einverstanden, dass die Schwanzrekursion gut ist. Ich arbeite an einem Lisp-Dialekt, der Clojure ähnelt, aber in Python gehostet wird: ghewgill.livejournal.com/tag/psil für weitere Informationen.
Greg Hewgill

9
Javier, Clojure hat eine 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 .
Ayrnieu

9
Die JVM ist von zentraler Bedeutung für Clojures Macht und wird durch nichts behindert.
Rayne

5
Nur ein weiterer Kommentar zu Clojure. Clojure ist ein "praktischer" und eigensinniger Lisp. Praktisch, weil die Verwendung der JVM die Reichweite des größten Echosystems bietet, das heute existiert. Die Unterstützung der Bibliothek ist erstaunlich. Und diese sind sehr ausgereift, breit und von Produktionsqualität. Nur wenige Echosysteme können sich vergleichen. Meinungsbildend, weil Clojure Unveränderlichkeit umfasst und OOP um jeden Preis vermeidet. Das ist interessant und gut. Aber Sie können es zu der Zeit ärgerlich finden. Dies ist möglicherweise nicht Ihre Tasse Tee. Clojure ist aus Lernsicht möglicherweise nicht das beste Lisp. Aber es ist sicherlich eines der besten, etwas Professionelles daraus zu machen.
Nicolas Bousquet

34

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.


Was ist die absurde Kruft der 80er?
X10D

20

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.


Ich denke, das ist eine gute Antwort. Aber Sie müssen nicht so weit gehen, um eine ganze Sprache zu lernen. Ich habe genug über Scheme gelesen, um zu wissen, dass ich damit nicht zufrieden sein werde. Common Lisp ist eher mein Stil, aber es hat mich nicht von Perl weggezogen. Wenn Sie Sprachen lernen möchten, wählen Sie nicht nur eine aus.
Jon Ericson

19

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.


18

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 RETist 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.)


1
Wie ist Let Over Lambda? Ich habe überlegt, das für den Rest der Kapitel zu kaufen, die nicht online sind.
Greg Hewgill

Ich lasse es dich wissen. Alles, was ich bisher getan habe, ist das Forth-Kapitel zu überfliegen.
Ayrnieu

IN ORDNUNG. Ich musste eine Weile nachdenken und versuchen, mich an frühere Stadien meiner Entwicklung zu erinnern und andere Bücher erneut zu lesen, um ihnen gegenüber fair zu sein. Aber ohne das: LOL ist das Beste. Das Buch malt ein Ziel auf die "stilistischen Aphorismen" gegen Makros, kursiv geschrieben im ersten Abschnitt des ersten Kapitels.
Ayrnieu

Danke dafür, ich habe ein Exemplar bestellt!
Greg Hewgill

Gott sei Dank für # + und # -. Ohne sie ist der Zugriff auf CLI-Argumente und jedes andere POSIX-Verhalten nahezu unmöglich. rosettacode.org/wiki/ScriptedMain#Common_Lisp
mcandre

9

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.


Common Lisp ist ein Standard. Dies gilt auch für die verschiedenen Standards des RSx-Schemas. Was ich an DrScheme am meisten ablehne, ist das Standardobjektmodell.
Friedrich


6

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.


5

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.



4

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.


4

Ich kenne Lisp nicht, aber hier ist der Grund, warum ich das PLT-Programm für eine gute Wahl halte:

  1. Wirklich gute Dokumentationen
    http://download.plt-scheme.org/doc/html/

  2. 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

  3. 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.

  4. 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

  5. Kostenlose Bücher und interessante Tutorials für den Einstieg.
    http://www.htdp.org/
    http://world.cs.brown.edu/

  6. 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 .


3

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:

  • Ein sehr effizienter Compiler für numerische Berechnungen (SBCL),
  • Das Konditionssystem und ...
  • Ich muss zugeben, dass SLIME bei dieser Entscheidung ebenfalls eine wichtige Rolle gespielt hat. :-)

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.


2
Clojure hat einen lexikalischen Gültigkeitsbereich mit einem threadlokalen dynamischen Bereich von (normalerweise obersten) Variablen über binding.
Brian Carper

Was waren diese "Funktionen, von denen ich wusste, dass ich sie wahrscheinlich in den nächsten 2-3 Jahren in meinen Projekten verwenden würde"
Gregg Lind

1
@ Gregg Lind: Die "Merkmale" sind: 1) ein sehr effizienter Compiler für die numerische Berechnung und 2) das Bedingungssystem. Ich muss zugeben, dass SLIME bei dieser Entscheidung ebenfalls eine wichtige Rolle gespielt hat. :-)
Jay

@ Brian Carper: Danke! Ich wusste nicht, dass Clojure lexikalisch ist. Ich erinnere mich vage, auf clojure.org gelesen zu haben, dass es einen dynamischen Umfang hat, aber ich habe wahrscheinlich Fakten verwechselt.
Jay

@ Jay, danke für die Antwort, vielleicht füge es deiner Hauptantwort hinzu! Genau das ist interessant zu wissen.
Gregg Lind

1

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.


1

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.


> Wählen Sie alles andere als Closure aus. Ich wünschte wirklich, ich würde ein Gegenargument zum Zugriff auf alle JVM-Bibliotheken sehen, da ich mir wirklich nicht vorstellen kann, welches Java ich verwenden werde, wenn ich LISP / Scheme
Vlagged

Bitte unterstützen Sie diese Aussage. Warum sollten wir Clojure nicht verwenden?
Adam Arold

@edem hast du über die ersten vier Wörter hinaus gelesen? Erstens habe ich nie gesagt, dass Sie Clojure nicht verwenden sollten. Wenn Sie Clojure verwenden möchten, wählen Sie es. Wenn Sie dagegen Lisp lernen möchten, sollten Sie mit etwas beginnen, das näher an der Hauptlinie von Lisp liegt. Beispielsweise muss in Clojure die Schwanzrekursion im Code explizit sein. Ein Großteil der Bibliothek ist in Java implementiert. Sie werden auch auf "Ist seltsame Funktion X Teil von Lisp oder spezifisch für Clojure" stoßen.
Kevin Peterson

Ich habe Clojure gestartet, nachdem ich das Practical Common Lisp-Tutorial abgeschlossen hatte. :) Danke für die Information.
Adam Arold

0

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.


0

Es gibt dort nur sehr wenige echte Möglichkeiten, entweder SBCL, Clojure oder PLTScheme.

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.