Archiv für die Kategorie ‘Lisp’

Außer der Reihe: Abenteuer Lisp lernen

Freitag, 25. Juli 2008

Im Urlaub möchte man ja immer etwas schönes machen. Der eine geht Berge besteigen, eine andere lockt der Strand. Und ich will schon seit einiger Zeit endlich mal Lisp lernen. Verrückt, oder?

Aber wieso ausgerechnet Lisp???

Nun, was Lisp so interessant macht, ist die Tatsache, dass dessen Wurzeln bis in die 50er-Jahre des letzten Jahrhunderts zurückgehen und Lisp damit die zweitälteste heute noch verwendete Programmiersprache überhaupt ist. Die älteste ist Fortran. Dabei bilden Fortran und Lisp zwei gegensätzliche Pole bezüglich der programmiersprachlichen Ansätze, zwischen denen sich die heutigen Programmiersprachen bewegen. Während der Fortran-Ansatz eher maschinennah auf pure Rechenleistung ausgerichtet war, war Lisp problemorientierter, hochsprachlicher und in vielen Dingen seiner Zeit voraus. Z.B. wurden viele Innovationen wie das if/then/else-Konstrukt, rekursive Funktionsaufrufe, Garbage collection und Closures zuerst in Lisp eingeführt und fanden oder finden erst nach und nach Einzug in die Mainstream-Programmiersprachen.

Außerdem gibt es in Lisp keinen Unterschied zwischen Programm und Daten. Beides sind einfache Listen, die auf die gleiche Art programmatisch behandelt werden können. Damit kann man auf relativ natürliche Weise das Programm selbst anpassen, neuen Code erzeugen oder vorhandenen modifizieren. Das nennt man dann Makros, die aber nicht wie die C-Makros auf rein textueller Ebene arbeiten sondern auf Sprachebene. Deshalb nennt man Lisp auch die programmierbare Programmiersprache (“Lisp is a programmable programming language.”, John Foderaro, CACM, September 1991; siehe Lisp-Quotes von John Graham).

In Java gibt es ja auch so etwas ähnliches: Frameworks wie Spring und Hibernate erzeugen z.B. dynamisch (also während des Programmlaufs) Proxy-Klassen, die ein bestimmtes Interface implementieren und damit indirekt der Zielklasse neue Funktionalität einbauen. Das ganze funktioniert hier aber nicht mit Java-Sprachmitteln sondern auf Bytecode-Ebene (mit Bibliotheken wie cglib). In der Java-Welt ist das ein aktuelles Thema obwohl man dazu die Java-Ebene verlassen muss. Was mich an Lisp so fasziniert, ist die eingebaute Möglichkeit, genau so etwas mit Sprachmitteln bewerkstelligen zu können.

Mit dem Buch Practical Common Lisp von Peter Seibel gibt es sogar eine moderne und praxisnahe Einführung in Common Lisp. Das Buch ist unter dem obigen Link frei verfügbar im Netz als HTML-Version. Eine ebenfalls frei verfügbare PDF-Version gibt es direkt beim Verlag (links der Link Free eBook Download).

Gestern habe ich die ersten drei Kapitel durchgearbeitet. Neben dem der obligatorischen überblicksmäßigen Einführung des ersten Kapitels wird einem im zweiten Kapitel die Benutzung der klassischen Lisp-Arbeitsumgebung Emacs mit SLIME (Superior Lisp Interaction Mode for Emacs) näher gebracht. In einem Puffer hält man seine Lisp-Sourcecodedatei und in einem anderen läuft die Common-Lisp-Implentierung der Wahl (z.B. CLISP) im interaktiven Modus. Dann kann man z.B. eine Funktion, die man in der Lisp-Datei deklariert einzeln kompilieren und hat sie dann im interaktiven Puffer zum Testen zur Verfügung. Eine Arbeitsweise, die ich schon bei Python schätzen gelernt habe, nur dass man in Python nicht einzelne Funktionen neu in den interaktiven Modus laden kann, das geht hier nur Dateiweise.

Um gleich loslegen zu können, gibt es die ganze Programmierumgebung als leicht installierbares Paket Lispbox. Mit der Linux-Version hatte ich allerdings so meine Probleme. Das Start-Skript brach mit einer Fehlermeldung ab. Das kann man aber leicht beheben, wenn man das erste if in lispbox.sh auskommentiert bis auf den else-Zweig. Die Version mit Allegro Common Lisp konnte ich aber dennoch nicht zum Laufen überreden, da das Programm newlicence zum Download der Trial-Lizenz nicht mehr funktionert. Es gibt aber zum Lernen auch eine komplette Lisp-IDE zum freien Download (Express-Edition mit einigen Einschränkungen gegenüber der kommerziellen Version). Damit funktionierte auch der Download der Trial-Lizenz (die aber nicht mit der Lispbox-Version zusammenarbeitet).

Die CLISP-Version von Lispbox funktioniert aber nach der Behebung des Fehlers im Startskript problemlos. Unter Ubuntu ist es allerdings auch nicht viel komplizierter Emacs mit SLIME einzurichten. Zusätzlich zu den entsprechenden Paketen für Emacs, SLIME und z.B. CLISP, die man installieren muss, braucht man nur noch die ~/.emacs Datei anzupassen.

Das dritte Kapitel greift schon mal vor und gibt einem anhand eines etwas komplexeren Beispiels, einen Einblick, was mit Lisp möglich ist. Die Beispiele kann man leicht selber nachvollziehen, dadurch ergeben sich viele Aha-Momente, die richtig Lust auf mehr machen.

Leider muss ich meine weiteren Lisp-Abenteuer auf später verschieben, denn GDI-2 und Mathe warten ja auch noch auf weitere Bearbeitung.