RTFM #4: Common Lisp

the next big thing Golo Roden  –  1 Kommentare

Die Serie RTFM stellt in unregelmäßigen Abständen zeitlose und empfehlenswerte Bücher für Entwicklerinnen und Entwickler vor. Primär geht es um Fachbücher, doch gelegentlich sind auch Romane darunter. Heute geht es um "Common Lisp: A Gentle Introduction to Symbolic Computation" von David S. Touretzky.

Praktisch alle modernen Programmiersprachen basieren auf Konzepten, die erstmals in Lisp eingeführt wurden. Dazu gehören unter anderem die if-Anweisung, der rekursive Aufruf von Funktionen und der Symbol-Datentyp. Allerdings gibt es auch Konstrukte, die bislang nur Lisp beherrscht. Es liegt daher nahe, dass die Beschäftigung mit Lisp dazu führt, ein besseres Verständnis von Programmierung zu entwickeln – und zwar gänzlich unabhängig von der eigenen Erfahrung.

Dazu passt auch ein Zitat des US-amerikanischen Informatikers Eric S. Raymond, der einmal gesagt hat, Lisp sei selbst dann eine lernenswerte Sprache, wenn man sie niemals verwenden werde. Der Erkenntnisgewinn allein führe bereits dazu, ein allgemein besserer Entwickler zu werden. Was liegt also näher, als bei Gelegenheit ein Buch zu Lisp zu lesen?

RTFM #4: Common Lisp

Dazu empfiehlt sich "Common Lisp: A Gentle Introduction to Symbolic Computation" von David S. Touretzky. Das Buch stammt aus dem Jahr 1990, ist im Vergleich zu Lisp als Sprache also noch relativ jung, und umfasst rund 450 Seiten.

Funktionen und Listen

Das erste Kapitel führt zunächst einige Grundbegriffe ein, darunter Funktionen, Symbole und Komposition. Das erfolgt dabei ohne Code, allein auf der Basis von Diagrammen und Zeichnungen, wodurch das Buch auch ohne Vorkenntnisse in der Programmierung verständlich und zugänglich wird. Im Prinzip gibt das erste Kapitel einen Eindruck von der Frage, was Programmierung überhaupt ist.

Das zweite Kapitel führt dann Listen als grundlegende Datenstruktur ein, was bei einer Sprache, der Name ein Akronym für "List Processing" ist, wenig verwunderlich ist. Damit wird zugleich aber auch die Grundlage für die S-Expressions gelegt, die in Lisp verwendet werden, um sowohl Code als auch Daten zu darzustellen.

Das dritte Kapitel führt schließlich die EVAL-Funktion ein, mit der die Auswertung eben dieser S-Expressions erfolgt. An dieser Stelle wird nun auch Lisp als Sprache auf dem Computer genutzt, sodass sich nun tatsächlich ausführbare Programme schreiben lassen.

Seiteneffekte & Co.

Im vierten Kapitel stoßen nun Bedingungen dazu, um komplexere Programme schreiben zu können. Bemerkenswert ist, dass bis hierhin weder Variablen noch Seiteneffekte eingeführt wurden. Der Stil, den das Buch vermittelt, kann man bis hierhin durchaus als funktional bezeichnen.

Das ändert sich dann allerdings im fünften Kapitel, wo ebendiese Konzepte nun ergänzt werden, was aber direkt aufzeigt, um wie viel schwieriger die Auswertung und auch die Vorhersage von Code werden, da man über zeitliche Aspekte nachdenken muss und nicht mehr länger nur mit Funktionen im mathematischen Sinne zu tun hat.

Das sechste Kapitel schließlich führt weitergehende Datenstrukturen ein, die auf Listen basieren, darunter Bäume. Es geht um veränderliche und unveränderliche Datenstrukturen, unterschiedliche Effizienz von Datenstrukturen, Identität, Gleichheit, und andere fortgeschrittene Themen. Dieses Kapitel schließt sozusagen die Vorstellung der Grundlagen ab.

Paradigmen: Funktional, rekursiv …

Im Anschluss daran stellen das siebte und achte Kapitel zwei Programmierparadigmen vor, nämlich das applikative und das rekursive. Insbesondere diese beiden Kapitel können beitragen, über den gewohnten Tellerrand hinaus zu blicken.

Den meisten Entwicklerinnen und Entwicklern dürfte zwar bewusst sein, dass beispielsweise iteratives und rekursives Vorgehen gleichermaßen mächtig sind – aber es ist doch etwas anderes, wenn noch einmal deutlich vor Augen geführt wird, dass man gänzlich ohne jegliche iterativen Konstrukte arbeiten kann, indem man ausschließlich auf Rekursion und Endrekursion setzt.

Die verbleibenden fünf Kapitel behandeln dann schließlich verschiedene Konzepte, die in Ergänzung zu den bis hier genannten Themen stehen. Dazu zählen beispielsweise I/O-Zugriffe, Blockstrukturen, das Typsystem von Lisp und Makros.

Fazit

Die Reihenfolge, die das Buch dabei insgesamt einschlägt, kann man durchaus als ungewöhnlich bezeichnen. Viele Themen, die in anderen Büchern über Programmierung verhältnismäßig früh behandelt werden (beispielsweise Schleifen oder Variablen), kommen in diesem Buch erst sehr spät zur Sprache. Das Buch findet dabei eine gute Balance zwischen einfacher Verständlichkeit und tiefergehenden Details.

Die Sprache Lisp wird bei all dem fast zur Nebensache. Natürlich lernt man auch Lisp, aber es lässt sich vor allem viel Konzeptionelles mitnehmen. Daher ist das Buch auch eine gute Lektüre für alle Entwicklerinnen und Entwickler, die Lisp zwar nicht im praktischen Einsatz haben, aber sich für Programmierung und Programmierkonzepte im Allgemeinen interessieren.