Wo man lernt, wie man Common Lisp praktisch benutzt [geschlossen]

79

Ich bin ein C ++ - Programmierer, der versucht, Common Lisp zu lernen. Ich habe mir einige Bücher wie Land of Lisp angesehen und zahlreiche Online-Artikel über die verschiedenen Tugenden von Lisp gelesen. Ich brauche jedoch einen Rat.

Fast alles, was ich über Common Lisp gelesen habe, hat damit zu tun, wie erstaunlich es ist und wie erstaunlich schnell man Dinge damit erledigen kann und wie es vor 30 Jahren erstaunlich viele Probleme mit modernen Programmiersprachen gelöst hat. Außerdem, wie erstaunlich Makros sind und wie jedes Programmierparadigma (OO, funktional, akteursbasiert oder was auch immer usw.) in Lisp verwendet werden kann und wie Listen die ultimative Datenstruktur darstellen. Grundsätzlich behandelt man Lisp wie eine Forschungssprache und sagt, wie anders und revolutionär es ist.

Und all das Zeug ist wahrscheinlich wahr, aber das Problem ist, dass ich nicht viel gesehen habe, wie man praktische Dinge wie das Lesen einer Datei und das Aufteilen in Wörter und das Verarbeiten daran macht. Ich bin nicht daran interessiert, Common Lisp zu lernen, um Common Lisp zu lernen, sondern um das, was ich früher in C ++ gemacht habe, schneller und mit weniger Fehlern zu erledigen.

Meine Frage ist also, was die beste Ressource ist (sei es eine Website, ein Buch, irgendetwas), die sich darauf konzentriert, zu lehren, wie man Common Lisp verwendet, um allgemeine Programmieraufgaben wie zu erledigen

  • So lesen Sie Dateien
  • So lesen Sie eine Datei, ersetzen Wörter in der Datei und schreiben das Ergebnis zurück in die Datei
  • Iterieren Sie die Dateien in einem Verzeichnis und anderen Dateien
  • Interagiere mit einer SQL-Datenbank
  • Kommunikation über Steckdosen
  • Threading für Sachen wie einen Webserver
  • Erstellen Sie GUIs
  • Führen Sie Operationen an Binärdateien aus
  • Schreiben Sie einen Parser (kein Interpreter für Lisp in Lisp, was meines Wissens 5 Zeilen Lisp entspricht).
  • Interagiere mit dem Betriebssystem (dh in C oder C ++ geschriebene Dinge), um Dinge zu tun, die Lisp nicht nativ tun kann
  • Wie schreibe ich Lisp-Erweiterungen in C (ist das möglich?)
  • Betten Sie einen Lua-Dolmetscher ein (ist das möglich?)

Und auch in einem weniger unmittelbar praktischen Hinweis, wie allgemeine Datenstrukturen in Lisp wie Heap, Stack, binärer Suchbaum usw. implementiert werden. Dies kann jedoch nur die Listenoperationen von Lisp wie carund cdrauf die richtige Weise verwenden. Ich weiß es nicht.

Ich bezweifle sehr, dass all dies (mit der unwahrscheinlichen Ausnahme der letzten beiden in der Liste) mit Lisp unmöglich ist oder die Leute es nicht so sehr lieben würden. Und das oben erwähnte Zeug, das ich gelesen habe, erwähnt eine Menge realer Software, die in Lisp geschrieben wurde (Yahoo! Web Store fällt mir ein).

Nachdem ich zuvor in einer ( der? ) Imperativen Sprache programmiert habe , bin ich bestrebt, das neue Wissen zu nutzen, das ich zum Schreiben realer Anwendungen erhalte. Was ist der schnellste Weg, um das Schreiben praktischer Software mit Lisp zu lernen?

Übrigens habe ich Peter Seibels praktisches gemeinsames Lisp gesehen, aber nach dem Inhaltsverzeichnis berührt es nur einige der Dinge, für die ich lernen möchte, Lisp zu verwenden.

Noch eine Frage, wenn ich darf (Entschuldigung, wenn hier zwei Fragen zu einer zusammengefasst werden), wo finde ich einen Verweis auf die Funktionen und Dinge von Lisp?

Und ich möchte Lisp wirklich mögen.

NewLisper
quelle
3
Gute Frage. Ich selbst, ein C ++ - Programmierer, habe diesen Sommer Lisp gelernt, hauptsächlich mit den in den Antworten vorgeschlagenen Büchern. Bis jetzt sehr glücklich, aber ich komme immer noch durch Makros. On Lisp von Paul Graham ist ein echtes Juwel. Das Material zu Emacs Lisp hilft Ihnen außerdem dabei, den Überblick über Lisp im Allgemeinen zu behalten, und ermöglicht es Ihnen, wirklich nützliche Skripte aus dem Editor heraus zu schreiben.
Diego Sevilla
Es gibt jetzt eine umfangreiche Common Lisp Ressourcen Seite auf der Seite Erste Schritte von Common Lisp auf Docs.SO.
Gustav Bertram
Es gibt jetzt auch ein aktuelles Common Lisp-Kochbuch . Das Inhaltsverzeichnis ist jedoch noch nicht so umfangreich, daher suchen wir in der Awesome CL- Liste nach fantastischen und modernen Bibliotheken . Und +1 für E. Weitz '"CL Recipes".
Ehvince

Antworten:

94

Ich würde vorschlagen, " Practical Common Lisp " zu lesen , da es bereits einige Ihrer Fragen beantwortet.

Es gibt wahrscheinlich drei bis vier Bücher, die Sie lesen sollten :

Gemeinsame Lisp-Referenz

Anleitungen

Als nächstes sollten Sie das Handbuch Ihrer Lisp-Implementierung lesen. Es werden viele spezifische Erweiterungen beschrieben: Netzwerke, Threads, ...

Dokumentation für Common Lisp-Implementierungen:

SLIME (die Emacs-basierte Lisp-IDE) verfügt über ein SLIME-Benutzerhandbuch .

Dokumentation für Common Lisp-Bibliotheken:

Bibliotheken

Für Bibliotheken verwenden

Schauen Sie sich nun einige Ihrer Punkte an:

  • So lesen Sie Dateien

Weitere Informationen finden Sie im Wörterbuch für Dateien und Streams in HyperSpec . WITH-OPEN-STREAM, READ, READ-LINE, READ-CHAR, READ-BYTE, READ-SEQUENCE, ...

  • So lesen Sie eine Datei, ersetzen Wörter in der Datei und schreiben das Ergebnis zurück in die Datei

Verwenden Sie oben. Siehe auch: SCHREIBEN und verwandt.

  • Iterieren Sie die Dateien in einem Verzeichnis und anderen Dateien

Siehe oben. VERZEICHNIS, Pfadnamen, ...

  • Interagiere mit einer SQL-Datenbank

Verwenden Sie zum Beispiel die CLSQL-Bibliothek.

  • Kommunikation über Steckdosen

Lesen Sie das Handbuch Ihres Lisp oder verwenden Sie eine der tragbaren Bibliotheken. Siehe Quicklisp.

  • Threading für Sachen wie einen Webserver

Lesen Sie das Handbuch Ihres Lisp oder verwenden Sie eine der tragbaren Bibliotheken. Siehe Quicklisp.

  • Erstellen Sie GUIs

Hängt davon ab. Siehe Quicklisp oder eine implementierungsspezifische Bibliothek.

  • Führen Sie Operationen an Binärdateien aus

Siehe Hyperspec für Datei- und Stream-Vorgänge. WRITE-BYTE, READ-BYTE. Öffnen Sie einen Stream als binären Stream.

  • Schreiben Sie einen Parser (kein Interpreter für Lisp in Lisp, was meines Wissens 5 Zeilen Lisp entspricht).

Verwenden Sie dazu eines der vorhandenen Tools. Studieren Sie vorhandene Parser. Es gibt viele Parser, die in Lisp geschrieben sind, aber nicht viel in Büchern darüber (außer Parser in natürlicher Sprache, die in der KI-Literatur beschrieben sind).

  • Interagiere mit dem Betriebssystem (dh in C oder C ++ geschriebene Dinge), um Dinge zu tun, die Lisp nicht nativ tun kann

Hängt davon ab. Siehe Quicklisp oder eine implementierungsspezifische Bibliothek.

  • Wie schreibe ich Lisp-Erweiterungen in C (ist das möglich?)

Hängt davon ab. Siehe Quicklisp oder eine implementierungsspezifische Bibliothek. -> FFI

Abschließender Rat: Lesen Sie den Code anderer Autoren.

Studieren Sie anderen Lisp-Code. Es gibt genug sehr unterschiedlichen Lisp-Code da draußen. Vom Webserver zur Musikkompositionssoftware.

Rainer Joswig
quelle
2
Es scheint, dass viele Dinge implementierungsspezifisch sind. Gibt es so etwas wie C, das nicht implementierungsspezifisch, sondern betriebssystemspezifisch ist ? Es scheint nicht machbar zu sein, dass jeder, der Ihren Code haben möchte, die von Ihnen ausgewählte Implementierung verwendet. Ich interessiere mich auch nicht wirklich für KI.
NewLisper
4
@NewLisper: Es gibt viele Portabilitätsbibliotheken. Siehe Quicklisp.
Rainer Joswig
4
@NewLisper: Auch wenn Sie nicht an KI interessiert sind, sollten Sie einen Teil der Literatur lesen, da darin der Ansatz der symbolischen Programmierung beschrieben wird, für den Lisp erfunden wurde.
Rainer Joswig
2
@NewLisper: Dies ist eine ziemlich vollständige Antwort. Lisp ist Python in Bezug auf die OS & C / C ++ - Aufrufe näher. Es soll ziemlich einfach sein, ein FFI (Foreign Function Interface) zusammenzustellen. Es ist auch erwähnenswert, dass es den Anschein hat, dass das Übergewicht der Common Lisp-Benutzer im Web SBCL zu verwenden scheint.
Paul Nathan
2
Ich würde einige konkrete Bibliotheken hinzufügen: sockets: usocket; Webserver: Hunchentoot; Einfädeln: Bordeaux-Fäden, Chanl; OS-Interaktion / Verknüpfung von C-Sachen: CFFI, UFFI.
Svante
6

Schauen Sie sich Cliki an, das Common Lisp-Wiki , das eine Liste der für Common Lisp verfügbaren Bibliotheken enthält, mit denen Sie alle Ihre Aufgaben erledigen können.

Außerdem sollten Sie sich das Common Lisp Cookbook ansehen (es gibt auch eine aktuellere Version ). Es enthält eine Reihe von Code für allgemeine Aufgaben wie das zeilenweise Lesen einer Datei und Fremdfunktionsschnittstellen für die Interaktion mit in C geschriebenen Bibliotheken .

Sie können Erweiterungen für Lisp in C schreiben, je nachdem, welche Implementierung Sie verwenden. Mit Emacs-Lisp können Sie dies beispielsweise tun, obwohl es sich nicht um Common Lisp handelt. Normalerweise möchten Sie den Code in Common Lisp schreiben und ihn dann mithilfe verschiedener Lisp-Compiler-Deklarationen oder der anderen Methode, bei der Sie eine Fremdfunktionsschnittstelle verwenden, so weit wie möglich optimieren.

Das Threading hängt davon ab, welche Implementierung Sie verwenden, aber ich denke, die meisten von ihnen haben jetzt Threads.

Hunchentoot ist einer der besten Lisp-Webserver und der Einstieg ist recht einfach. Sie müssen selbst keinen Threading-Code schreiben, sondern nur die Funktionen des HTTP-Anforderungshandlers schreiben.

Jemand hat eine Liste der GUI-Optionen für Lisp zusammengestellt :

  • cl-gtk2, eine Schnittstelle zur GTK-GUI-Bibliothek
  • McClim
  • Granat
  • Common Qt
  • EQL

quelle
1
Common Lisp Cookbook sieht wirklich nützlich aus. Wie ich dem anderen gesagt habe, scheint es, dass viele Dinge implementierungsspezifisch sind. Es scheint nicht fair zu sein, dass jeder, den Sie in der Lage sein möchten, Ihren Code auszuführen, dieselbe Implementierung verwendet, die Sie verwenden. Ist das so?
NewLisper
Ja, so ist es, manche Leute versuchen, sich an den ANSI Common Lisp-Standard zu halten oder sich an Bibliotheken zu halten, die über mehrere Implementierungen hinweg funktionieren, damit es nicht zu mühsam wird.
Verlieren Sie die Fähigkeit, viele Dinge zu tun, wenn Sie sich an ANSI Common Lisp halten, wie z. B. Dateisystem-, Netzwerk- usw.?
NewLisper
Lisp macht es einfach, tragbare Bibliotheken über implementierungsspezifische APIs zu schreiben, sodass ich mir darüber keine Sorgen machen würde.
Pavel Penev
Hey, würde es Ihnen etwas ausmachen, die URL des Kochbuchs in lispcookbook.github.io/cl-cookbook zu ändern ? Es ist der gleiche Inhalt, aber weitgehend erweitert, das veraltete Material entfernt und in einer besser aussehenden Form. Sehen Sie seine Git-Geschichte! Vielen Dank.
Ehvince