LISP
LISP ist eine Programmiersprache, die 1959 am Massachusetts Institute of Technology (MIT) als Implementierung des Lambda-Kalküls entstand.
LISP steht für List Processing. Damit waren ursprünglich FORTRAN-Unterprogramme gemeint, mit denen symbolische Berechnungen durchgeführt werden sollten, wie sie im Lambda-Kalkül gebraucht werden. Einer der Studenten von John McCarthy kam dann auf die fundamentale Idee, einen Interpreter für diese Ausdrücke zu programmieren, womit die Programmiersprache LISP geboren war.
Die Grunddatenstrukturen von LISP sind Einzelwerte (Skalarwerte), die Atome genannt werden und Listen. Die Listen können beliebig verschachtelt werden (Listen von Listen). Damit lassen sich auch leicht Datenstrukturen wie ein assoziatives Array implementieren. Die Listen werden mit runden Klammern dargestellt:
(A B C)
Auch Programmanweisungen sind Listen, was es ermöglicht, Programmteile beliebig zu manipulieren. Dies ist beispielsweise wichtig, wenn der Programmierer neue Kontrollstrukturen oder Objektsysteme (OOP) entwickeln will (Metaprogrammierung, Makros).
Lisp bietet dem Programmierer große Flexibilität und weit reichende Einflussmöglichkeiten, weshalb es manchmal auch als „programmierbare Programmiersprache“ bezeichnet wird. Datenstrukturen werden dynamisch aufgebaut, ohne dass der Programmierer explizit Speicherplatz reservieren oder freigeben muss (siehe auch Garbage-Collection). Deklarationen für Daten sind nicht nötig und ein Lisp-Symbol kann als Variable beliebige Arten von Objekten bezeichnen. Viele dieser Eigenschaften sind im Laufe der Zeit in weitere Programmiersprachen übernommen worden. Anfang der 50er waren sie sicherlich ihrer Zeit weit voraus.
Programme in Lisp können interpretiert oder von einem Compiler in effizienten Maschinencode übersetzt werden. Dadurch verbinden sich für den Programmierer die Vorteile einer Skriptsprache (schnellere Entwicklungszyklen, einfachere Testbarkeit, höhere Flexibilität) mit denen einer kompilierten Sprache (Ausführungsgeschwindigkeit).
| Inhaltsverzeichnis |
Minimaler Funktionsumfang für Lisp
Nur ganz wenige Operatoren und ein allgemeiner Mechanismus zur Funktionsdefinition sind nötig um ein minimales Lisp-System zu implementieren. Die folgenden Funktionen sind im ursprünglichen Bericht von McCarthy enthalten:
- first (gibt das erste Element einer Liste zurück; hieß ursprünlich car)
- rest (gibt die Restliste (ohne das erste Element) zurück; hieß ursprünglich cdr)
- cons (verknüpft zwei Listen)
- quote (verhindert Auswertung)
- eq (Test auf Gleichheit)
- cond (bedingte Ausführung)
- Mechanismus zur Funktionsdefinition
Bereits mit diesen Sprachmitteln kann ein bemerkenswerter Teil der Funktionen, die übliche Lisp-Systeme mitbringen, definiert werden. Typischerweise besteht ein Lisp-System auch aus einem kleinen, oft in C implementierten Kern, und einer großen Bibliothek von weiteren Lisp-Definitionen.
Lisp und KI
Historisch war LISP mit PROLOG die Programmiersprache der künstlichen Intelligenz.
Zitat
Lisp is a programmable programming language. (Lisp ist eine programmierbare Programmiersprache) Edsger Dijkstra, CACM, 15:10
Lisp-Dialekte
Heute aktuell verwendete Dialekte
- Common LISP (beruht auf ZetaLISP, Franz Lisp und einigen Einflüssen von InterLISP. Ist heute der Industriestandard.)
- Scheme (eine akademische "reine, minimale" Variante, lexical variable scoping and continuations.)
- Emacs Lisp Die Skript-Sprache des Emacs-Editors
Andere Lisp-Varianten.
Bekannte Abkömmlinge:
Programmbeispiele
Das berühmte Hallo-Welt-Programm in Common-Lisp:
(format t "Hallo Welt!~%")
Iteration durch eine Liste
(dolist (elem '(ROT BLAU GRÜN)) (print elem))
ergibt als Resultat
ROT BLAU GRÜN NIL
(ROT BLAU GRÜN) ist eine Liste. Der Anführungsstrich vor der Liste (Quote) bedeutet, dass die Liste direkt ohne Auswertung übernommen werden soll. Wenn das Quote nicht stehen würde, dann würde das bedeuteten, dass ROT als Befehl mit den Argumenten BLAU und GRÜN interpretiert würde. Das NIL im Resultat stammt nicht vom Listendurchlauf, sondern ist der Rückgabewert des gesamten Ausdrucks.
Ein Lisp-Programm zur Berechnung der Fakultät (nach den Semikola folgt ein einzeiliger Kommentar):
(defun ! (n)
(cond ((= n 0) 1) ; 0! = 1
((> n 0) (* n (! (- n 1)))))) ; n! = n * (n - 1)!
Aufruf: (! 6)
Weblinks
- John McCarthys Originalarbeit über Lisp
- Herbert Stoyan's Lisp Seiten (Geschichte, Personen, Bibliographie, sehr ausfuehrlich)
- Eine konzise Einführung in Anlehnung an McCarthys Arbeit
- Common Lisp HyperSpec – Referenz für den Common Lisp Standard
- Ein interaktiver LISP-Kurs Universität Trier
- Clisp – ein Open Source Common LISP für verschiedene Plattformen
- Lispworks – Eine für Privatpersonen kostenlose LISP Entwicklungsumgebung
- Franz - Eine weitere Lisp Entwicklungsumgung mit einer kostenlosen Trial-Version
- Slime – eine freie Common LISP Entwicklungsumgebung zur Basis von Emacs
- Practical Common Lisp (Online-Version einer sehr guten neuen Einführung in Common Lisp, engl.)
- Paul Graham On Lisp (kostenloses E-Book, engl.)
- Structure and Interpretation of Computer Programms (kostenloses E-Book, engl. - behandelt Scheme, nicht Common Lisp)
- newLisp Ein plattformunabhängier Lispdialekt, der für Skriptzwecke und Netzwerkapplikationen geeignet ist.
