Lisp (LISt Programming) gehört zu den funktionalen Programmiersprachen und wird wegen seiner Fähigkeiten vor allem in Bereich der künstlichen Intelligenz eingesetzt, ähnlich wie Prolog. Die funktionale Programmierung wurde erstmals 1958 in der durch McCarthy entwickelten Programmiersprache Lisp realisiert. Damit gehört Lisp neben Fortran und Cobol zu den ältesten höheren Programmiersprachen, die noch heute im Gebrauch sind. Obwohl Lisp schon so alt ist, verschließt es sich nicht "neumodischen" Programmierkonzepten/-paradigmen, wie z. B. der objektorientierten Programmierung (Common Lisp Object System). Common Lisp ist durch das Amerikanische Institut für Normung (ANSI) standardisiert, weshalb auch oftmals von ANSI Common Lisp die Rede ist.
Moderne Lisp-Dialekte sind Common Lisp und und Scheme. Lisp wird z. B. beim Emacs als Makrosprache (Emacs-Lisp) verwandt, sowie bei dem CAD-Programm Autocad. In früheren Zeiten wurden auch schon Rechner gebaut, die nativ - d.h. in der Hardware - Lisp interpretierten.
Wesentliche Sprachmerkmale
- fast alles in Lisp (Programme, Funktionen, Ausrücke, ...) sind Listen
- Präfixnotation (Polnische Notation): (FUNKTION Parameter Parameter ...)
- (+ (* 3 4) 5) entspricht (3 * 4) + 5
Programme und Daten sind identisch -> es ist sehr einfach selbstmodifizierenden Code zu schreiben
- z.B. Makros: Funktionen die Listen übergeben bekommen, aus denen sie dann Funktionen bauen
- Listen werden üblicherweise rekursiv bearbeitet, wobei der Kopf der Liste abgeschnitten wird und der Rest in die Rekursion geht.
- Gute Lispinterpreter/-übersetzer lösen solche Endrekursion automatisch auf, wodurch die Laufzeitnachteile der rekursiven Programmierung vermieden werden.
- Meist wird nicht destruktiv (nur lesen) gearbeitet, sodass die Listen beim Aufteilen nicht kopiert werden müssen, sondern nur ein Zeiger auf den hinteren Teil verwendet wird.
- Variable (d.h. die Zuweisungen an Variable) werden normalerweise nicht verwendet (Funktionsparameter natürlich schon)
Schleifen sind sehr unüblich (da sie Variablen benötigen) -> Rekursion
- Dispatching anhand der Typen aller Parameter!
Ein kleines Programmbeispiel
(defun addn (n) (lambda (x) (+ x n)))
gibt eine Funktion zurück, die n zu ihrem Argument addiert.
Querverweise
Lisp-Übersetzer/-Interpreter
sbcl/emacs/slime zentrierte lisp Einführung: http://ww.telent.net/lisp/according_to/
Implementationen: http://alu.cliki.net/implementation
Lisp lernen
'Practical Common Lisp' von Peter Seibel. Noch nicht gedrucktes, nicht vollständig fertiges, zum 'review' veröffentlichtes Buch. Bisher eher für Anfänger geeignet: http://www.gigamonkeys.com/book/
'On Lisp' von Paul Graham. Frei zum Herunterladen verfügbares Buch für Fortgeschrittene: http://www.paulgraham.com/onlisp.html
Referenzen
Die Common Lisp HyperSpec (TM). Entspricht dem Common Lisp Standard: http://www.lispworks.com/reference/HyperSpec/Front/
Das Meta Objekt Protokoll: http://www.lisp.org/mop/
Recourcen
Das Common-Lisp-Wiki. Freie Lisp-Resourcen: http://www.cliki.net/
Freies Hosting für Open-Source-Lisp-Projekte: http://www.common-lisp.net/
- IRC: #lisp@freenode
- News comp.lang.lisp
Eine echte Fanseite mit Anwendungsbeispielen (Webshop, Spamfilter) findet man bei Paul Graham, dem Autor der hervorragenden Einführung "ANSI Common Lisp" (0-13-370875-6).
Clisp, ein freier Lisp-Interpreter: http://www.clisp.org
Ein Suchwerkzeug nach niedrigen Flugpreisen ist ein aktuelles Anwendungsbeispiel von Lisp.