Gelesen: "Common Lisp: A Gentle Introduction to Symbolic Computation"

Der US-amerikanische Entwickler Eric S. Raymond hat einmal gesagt, Lisp sei selbst dann eine lernenswerte Sprache, wenn man sie niemals verwenden werde. Der Erkenntnisgewinn führe dazu, ein allgemein besserer Entwickler zu werden. Es liegt daher nahe, sich die Sprache näher anzusehen.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 6 Min.
Von
  • Golo Roden
Inhaltsverzeichnis

Der US-amerikanische Entwickler Eric S. Raymond hat einmal gesagt, Lisp sei selbst dann eine lernenswerte Sprache, wenn man sie niemals verwenden werde. Der Erkenntnisgewinn führe dazu, ein allgemein besserer Entwickler zu werden. Es liegt daher nahe, sich die Sprache näher anzusehen.

Die erste Version von Lisp wurde bereits 1958 spezifiert. Damit zählt die Sprache zu den ältesten Programmiersprachen, die sich noch im Einsatz befinden. Trotz ihres Alters kennt die Sprache zahlreiche Strukturen, die in vielen anderen Sprachen entweder gar nicht oder noch nicht allzu lange zu finden sind. Hierzu zählen beispielsweise Lambda-Ausdrücke und Makros.

Auf den ersten Blick wirkt Lisp-Code ungewohnt: In Lisp wird alles durch Listen repräsentiert, was nicht nur für Daten, sondern insbesondere auch für Code gilt. So enthält die Liste

'(2 3 5 7 11)

die ersten fünf Primzahlen, während die Liste

(+ 2 3 5 7 11)

die Summe derselben berechnet. Will man die +-Funktion auf die Datenliste anwenden, ist dies mit der apply-Funktion möglich, die JavaScript-Entwicklern bekannt vorkommen dürfte:

(apply #'+ '(2 3 5 7 11))

Beschäftigt man sich näher mit Lisp, findet man zahlreiche weitere Parallelen zu JavaScript. Der Einfluss von Lisp ist also auch heutzutage noch spürbar, wenn auch nicht zwingend auf den ersten Blick erkennbar.

Bereits der Zusammenhang zwischen JavaScript und Lisp lässt die Beschäftigung mit der Sprache lohnenswert erscheinen: Viele Konzepte von JavaScript sind besser verständlich, wenn man ihren Ursprung kennt. Doch wie gelingt der Einstieg?

Ein großer Vorteil einer dermaßen alten Sprache ist, dass es bereits zahllose Literatur gibt (gelegentlich ist das Problem von Lisp eher, das passende Buch in einem Antiquariat aufzustöbern). Ein besonders bemerkenswertes Exemplar ist "Common Lisp: A Gentle Introduction to Symbolic Computation" von David S. Touretzky, das erstmals 1990 erschienen ist.

Das Buch beginnt mit dem grundlegenden Datentyp von Lisp schlechthin, der Liste. Die ersten drei Kapitel beschäftigen sich mit Aufbau und Struktur von Listen, mit deren interner Verwaltung und einer geeigneten Notation. Unerwartet ist hierbei, dass der Autor auf den Einsatz von Code zunächst gänzlich verzichtet und stattdessen sämtliche Konzepte mit Diagrammen erläutert. Das macht das theoretische Fundament anschaulich, sodass sich das Buch trotz der Detailtiefe kurzweilig liest.

Im vierten Kapitel, in dem dann auch Code geschrieben wird, führt er die verschiedenen Bedingungen und logischen Operatoren von Lisp ein. Insbesondere bei den Makros and und or ist die Verwandtschaft zu JavaScript wieder deutlich zu erkennen.

Das fünfte Kapitel führt Variablen ein und geht damit erstmals auf einen Programmierstil ein, der auf Seiteneffekten basiert. Das Kapitel ist insbesondere mit dem Hintergrund der derzeitigen Renaissance der (puren) funktionalen Programmierung interessant: Auch hier sind die zugrundeliegenden Konzepte deutlich älter, als man allgemein vermuten würde. Das sechste Kapitel geht dann auf verschiedene Möglichkeiten ein, Listen als Basis für andere Datenstrukturen zu nutzen, beispielsweise für Mengen, Tabellen und Bäume.

Die beiden nachfolgenden Kapitel sind, wenn man so will, zwei Seiten der gleichen Medaille. Sie befassen sich mit der Verarbeitung aller Elemente einer Liste, wobei das siebte Kapitel einen applikativen Ansatz wählt, das achte hingegen einen rekursiven. Diese beiden Kapiteln bieten auch Entwicklern, die nicht mit Lisp arbeiten, viel Potenzial zum Nachdenken.

Das neunte Kapitel befasst sich mit der Ein- und Ausgabe von Daten, beispielsweise mit Hilfe des Terminals oder Dateien. Außerdem führt das Kapitel Streams ein, was ein weiteres Konzept darstellt, das heute wieder an Relevanz gewinnt.

Nachdem zuvor die applikative und die rekursive Programmierung besprochen wurden, beschäftigen sich die Kapitel 10 und 11 mit der prozeduralen Programmierung und führen hierfür klassische Schleifen ein, die Seiteneffekte hervorbringen. Das zwölfte und dreizehnte Kapitel widmen sich anschließend dem Erzeugen eigener Typen sowie einigen höheren Typen, die Lisp serienmäßig enthält, wie Arrays, Hash-Tables und Property-Lists.

Das vierzehnte und letzte Kapitel führt schließlich in die Programmierung mit Makros ein, die der Meta-Programmierung dienen. Mit ihnen ist es möglich, Lisp um eigene Syntax zu erweitern und auf dem Weg beispielsweise DSLs zu implementieren.

Herausragend ist, dass jedem einzelne Kapitel die richtige Balance zwischen allgemeiner Einführung in die Thematik und tiefgreifenden Details gelingt: Auf die Art spricht das Buch nicht nur Einsteiger an, sondern eignet sich auch als für lange Zeit ausgesprochen wertvolle Referenz.

Hilfreich ist darüber hinaus, dass jedes Kapitel mit zahlreichen kleinen Praxisaufgaben gespickt ist, die jeweils in der Regel mit wenigen Zeilen Code zu umzusetzen sind, für deren Lösung man zunächst aber einige Denkarbeit leisten muss. Umso erstaunlicher ist dann zu sehen, wie kompakt die Umsetzung in Lisp im Vergleich zu anderen Sprachen häufig ausfällt.

Alles in allem ist "Common Lisp: A Gentle Introduction to Symbolic Computation" ein außergewöhnlich gelungenes Buch. Es eignet sich als Einführung in die Sprache Lisp gleichermaßen wie als Einstieg in die Programmierung überhaupt.

Die Beschäftigung mit der Sprache macht Spaß und erweitert tatsächlich den eigenen Horizont. Dazu tragen nicht nur die Kapitel über die verschiedenen Paradigmen bei, sondern auch der Ausblick im letzten Kapitel, der lediglich erahnen lässt, welche Macht mit Hilfe von Makros zur Verfügung steht.

tl;dr: Lisp ist eine Programmiersprache aus dem Jahr 1958, die viele andere Sprachen maßgeblich beeinflusst hat, unter anderem JavaScript. Das besprochene Buch ist eine kurzweilige, verständliche und ausgesprochen detaillierte Einführung, die sich auch langfristig als Referenz eignet. ()