www.wikidata.de-de.nina.az
Common Lisp oft abgekurzt mit CL ist eine Multiparadigmen Programmiersprache innerhalb der Sprachfamilie Lisp Sie entstand aus einer 1981 gestarteten Bemuhung unter Leitung von Scott Fahlman 1 einen standardisierten Dialekt als Nachfolger von Maclisp und dessen Varianten 2 zu finden und wurde 1994 als ANSI Common Lisp standardisiert 3 Common LispLogoInoffizielles Lisp LogoBasisdatenParadigmen multiparadigmatisch funktional prozedural modular objektorientiert reflexivErscheinungsjahr 1984 1994 fur ANSI Common LispDesigner Scott E Fahlman Richard P Gabriel David MoonEntwickler ANSI X3J13 committeeTypisierung dynamischWichtige Implementierungen Allegro Common Lisp Armed Bear Common Lisp CLISP Clozure CL CMUCL Embeddable Common Lisp GNU Common Lisp LispWorks Movitz Poplog Scieneer Common Lisp Steel Bank Common LispDialekte CLtL1 CLtL2 ANSI Common LispBeeinflusst von Lisp Machine Lisp Maclisp Symbolics ZetaLisp Scheme InterlispBeeinflusste Dylan Eulisp ISLisp Ruby SubL Clojurecommon lisp net Inhaltsverzeichnis 1 Geschichte 2 Syntax 3 Datentypen 3 1 Skalare Typen 3 2 Datenstrukturen 3 3 Paketsystem 3 4 Funktionen 3 4 1 Definieren neuer Funktionen 4 Lese Kompilier und Laufzeit 4 1 Lesezeit und Lesemakros 4 2 Kompilierzeit und Lispmakros 5 Variablenbindung 5 1 Lexikalische Bindung und lexikalische Variablen 5 2 Dynamische Bindung und Sondervariablen 6 Vergleich mit anderen Lisp Dialekten 7 Verfugbarkeit von Paketen und Bibliotheken 8 Entwicklungsumgebungen 9 Literatur 9 1 Deutschsprachige Bucher 10 Weblinks 11 EinzelnachweiseGeschichte Bearbeiten1984 erschien die erste Ausgabe des Buches Common Lisp The Language kurz CLTL1 welches die erste Spezifikation der Sprache enthielt Kurz darauf wurde das ANSI Subkomitee X3J13 gegrundet um auf Basis der Spezifikation einen Standard zu erstellen Die zweite Ausgabe des Buches CLTL2 von 1990 enthielt Anderungen des Subkomitees und beschreibt einen Zwischenstand 1994 erschien die endgultige Version des Standards ANSI X3 226 1994 2 4 Syntax BearbeitenCommon Lisp benutzt S Expressions um sowohl Source Code als auch Daten darzustellen Funktions und Makroaufrufe werden als Listen geschrieben die als erstes Element den Namen der Funktion bzw des Makros enthalten Kommentare werden mit span class c1 span eingeleitet oder mit span class cm span umschlossen Addiere 2 und 2 2 2 Definiere die Variable p als 3 1415 defparameter p 3 1415 Setze die vorher definierte Variable p auf 42 setq p 42 Eine Funktion die ihr Argument quadriert defun square x x x Quadriere 3 square 3 Datentypen BearbeitenCommon Lisp unterstutzt eine Vielzahl von Datentypen mehr als viele andere Sprachen Diese Typen sind hierarchisch angeordnet Skalare Typen Bearbeiten Zahlen in Common Lisp sind vom Typ number Untertypen von number sind unter anderem integer Ganzzahlen ratio rationale Zahlen bzw Bruche real Gleitkommazahlen und complex komplexe Zahlen Arithmetik mit Ganzzahlen und Bruchen ist beliebig genau Eine Klasse von Programmfehlern in Sprachen wie C die durch uberlaufende Ganzzahlen verursacht werden ist in Common Lisp somit praktisch ausgeschlossen Der Common Lisp character Typ ist nicht auf ASCII beschrankt was nicht uberrascht da Lisp alter als ASCII ist Viele Implementierungen unterstutzen Unicode 5 Der Typ symbol ist ein besonderes Merkmal fast aller Lispdialekte in anderen Sprachfamilien hingegen grosstenteils unbekannt Ein Symbol in Common Lisp ist ahnlich einem Bezeichner in anderen Sprachen da es als Variable benutzt wird und Werte zugewiesen bekommen kann Da sie aber Objekte erster Klasse sind konnen sie auch zu anderen Zwecken benutzt werden Datenstrukturen Bearbeiten Common Lisp kennt eine Reihe vordefinierter Datenstrukturen Dazu zahlen unter anderem Hashtables Datenverbunde sogenannte structures Klassen Streams Pfadnamen mehrdimensionale Arrays und Folgen Letztere umfassen klassische Lisp Listen aber auch Bitvektoren allgemeine Vektoren und Zeichenketten Hashtables speichern Zuordnungen von Objekten So kann zum Beispiel einer Zeichenkette eine Zahl zugewiesen werden oder einem Symbol eine Funktion Bei Datenverbunden handelt es sich um beliebig verschachtelte Strukturen die Daten jedes beliebigen Typs vorhalten konnen Ein einzelner Verbund speichert in einer jeweils festen Menge von sogenannten slots Werte die spater nach Belieben verandert und extrahiert werden konnen Strukturen bilden eine einfache Vererbungshierarchie Arrays sind n dimensionale Listen von Werten die entweder alle denselben Typ haben mussen in sogenannten homogenen Arrays oder im Falle von heterogenen Arrays beliebig zusammengestellt sein konnen Sie unterstutzen die ublichen Matrixrechenoperationen und konnen auch in dynamisch veranderbaren Grossen auftreten Berechnungen mit homogenen in ihrer Grosse festgelegten Arrays konnen von Compilern meist sehr effizient ubersetzt werden Vektoren sind der Spezialfall von Arrays mit nur einer Dimension Es gibt vordefinierte Vektortypen wie die Zeichenkette ein Vektor von Zeichen oder den Bitvektor eine komfortable und effiziente Moglichkeit Bits zu speichern und mit ihnen zu rechnen Klassische Lisp Listen bestehen aus sogenannten CONS Zellen Damit sind geordnete Paare gemeint deren erstes Element der sogenannte CAR einen Wert enthalt wahrend deren zweites Element der sogenannte CDR auf die jeweils nachste Zelle oder im Falle des Listenendes auf das Symbol NIL zeigt Im Grunde handelt es sich bei Lisp Listen also um einfach verkettete Listen Sie werden heute hauptsachlich verwendet um Code darzustellen und mithilfe von Makros beliebig zu manipulieren ein Mechanismus der Common Lisp Programmierern einen Grad an Freiheit bietet der bei anderen Programmiersprachen dem Sprachdesigner vorbehalten bleibt Komplexere Daten speichert man fur gewohnlich in Klassen oder Verbunden und Daten mit denen man effizient rechnen mochte in Arrays bzw Vektoren Paketsystem Bearbeiten Common Lisp enthalt ein Paketsystem das es erlaubt Namensraume fur Symbole zu definieren und Letztere zu im und exportieren Ausserdem konnen der Bequemlichkeit und Lesbarkeit halber Abkurzungen bzw Spitznamen fur Pakete vergeben werden Symbole die sich in anderen Namensraumen als dem aktuellen befinden konnen angesprochen werden indem man vor ihre Namen mit einem Doppelpunkt getrennt den jeweiligen Paketnamen schreibt Beispielsweise zeigt der Name cl format stets auf das FORMAT Symbol im Paket CL unabhangig davon ob im aktuellen Paket moglicherweise eine Funktion definiert ist die ebenfalls FORMAT heisst Funktionen Bearbeiten In Common Lisp sind Funktionen normale Objekte die als Parameter ubergeben oder von einer Funktion zuruckgegeben werden konnen Dadurch konnen sehr allgemeine Operationen ausgedruckt werden Das Auswertungsschema fur Funktionen ist sehr einfach Wenn ein Ausdruck der Form span class p span span class nv F span span class w span span class nv A1 span span class w span span class nv A2 span span class w span span class err span span class p span vorliegt kann angenommen werden dass das Symbol mit dem Namen F ein spezieller Operator ist special operator ein schon definiertes Makro ist der Name einer Funktion ist Wenn F der Name einer Funktion ist dann werden die Argumente A1 A2 von links nach rechts ausgewertet und der entsprechenden Funktion als Parameter ubergeben Definieren neuer Funktionen Bearbeiten Das Makro span class nb defun span definiert Funktionen Eine Funktionsdefinition beschreibt den Namen der Funktion die Namen aller Argumente und den Funktionsrumpf defun square x x x Funktionsdeklarationen konnen Deklarationen beinhalten die dem Compiler Hinweise zur Optimierung u a bzgl Typen geben Zusatzlich konnen auch sogenannte documentation strings oder kurz docstrings angegeben werden die das Laufzeitsystem benutzen kann um dem Benutzer interaktive Hilfe zu bieten defun square x Berechne das Quadrat von X declare fixnum x Typangabe fur ein Argument optimize speed 3 debug 0 safety 1 the fixnum x x Typangabe fur den Ruckgabewert Anonyme Funktionen Funktionen ohne expliziten Namen werden mittels des span class k lambda span Operators nach dem Lambda Kalkul erzeugt Viele Common Lisp Programme benutzen Funktionen hoherer Ordnung bei denen es nutzlich ist anonyme Funktionen als Argumente zu ubergeben Lese Kompilier und Laufzeit BearbeitenAls Besonderheit gegenuber anderen Sprachen erlaubt Common Lisp es dem Programmierer eigenen Code nicht nur zur Laufzeit auszufuhren sondern auch in drei anderen Phasen der Lese der Kompilier und der Ladezeit Lesezeit und Lesemakros Bearbeiten Code der wahrend der Lesezeit ausgefuhrt wird kann den Parser steuern und so eigene Syntax definieren Meist geschieht dies in Form von sogenannten Lesemakros read macros oder auch reader macros die einzelnen Sonderzeichen zugewiesen werden und beliebigen Text in Code umwandeln konnen So gibt es beispielsweise Lesemakros die fur arithmetische Ausdrucke die gewohnte Infix Syntax bereitstellen und Ausdrucke wie span class mi 3 span span class w span span class nb span span class w span span class p span span class mi 4 span span class w span span class nb span span class w span span class mi 3 span span class p span in Common Lisp gultig machen Auch ad hoc kann ein Programmierer Code zur Lesezeit ausfuhren indem er sich des Standardlesemakros span class o span bedient Der Ausdruck span class p span span class nb span span class w span span class o span span class p span span class nb print span span class w span span class mi 10 span span class p span span class w span span class mi 20 span span class p span beispielsweise gibt nicht nur bei seiner Ausfuhrung 30 zuruck sondern druckt auch wahrend des Einlesens des Ausdrucks selbst die Zahl 10 auf dem Bildschirm aus Da diese Funktionalitat bereits das blosse Einlesen von Ausdrucken die beispielsweise uber ein Netzwerk empfangen wurden zu einem Sicherheitsproblem macht kann sie uber die Variable span class vg read eval span an und ausgeschaltet werden Kompilierzeit und Lispmakros Bearbeiten Common Lisp bietet wie fast alle Lisp Dialekte und im Gegensatz zu den meisten anderen Sprachen die Moglichkeit Code zur Kompilierzeit auszufuhren und damit die den Programmcode darstellenden S Ausdrucke beliebig zu manipulieren zu generieren und umzuformen Die Sprache sieht dafur in erster Linie die sogenannten Makros vor Da Lispmakros auf der Ebene der Programmstruktur arbeiten und sich dadurch in die Sprache selbst perfekt einfugen sind sie mit Makrosystemen anderer Sprachen nicht vergleichbar und wurden daher eigentlich einen eigenen Namen verdienen Makros konnen auf alle Common Lisp Funktionalitaten auch selbstdefinierte zugreifen wodurch ihnen sehr viele Moglichkeiten offenstehen Code umzuformen Common Lisp Programmierer verwenden Makros oft um anwendungsspezifische Sprachen in Common Lisp einzubauen die sich nahtlos in die Sprache einpassen und ihre Ausdrucksstarke erhohen Auch ist es moglich Makros zur Bereitstellung neuer Programmierparadigmen zu nutzen So ist zum Beispiel das im ANSI Standard enthaltene klassenbasierte Objektsystem CLOS metazirkular als ein Satz von generischen Funktionen und Klassen implementierbar uber die eine Schicht von Makros gelegt wird um die bequeme Definition von Klassen generischen Funktionen und anderen CLOS Sprachelementen zu ermoglichen Wie die Implementierung von CLOS tatsachlich aussieht hangt jedoch vom verwendeten Lispsystem ab und wird vom Standard nicht vorgeschrieben Variablenbindung BearbeitenWie die meisten anderen Sprachen kennt auch Common Lisp das Konzept des Bindens von Werten an Namen Es erweitert dieses Konzept jedoch durch zwei Aspekte Einerseits konnen Variablennamen selbst als normale Objekte verwendet und zum Beispiel weitergegeben oder gespeichert werden und andererseits stehen zwei ganz unterschiedliche Formen der Variablenbindung zur Verfugung Der erstgenannte Aspekt wurde bereits im Abschnitt uber Datentypen erlautert Lexikalische Bindung und lexikalische Variablen Bearbeiten Common Lisp verwendet standardmassig lexikalische Bindung lexical scoping ein Konzept das Scheme seinerzeit in die Lisp Welt eingefuhrt hat Dabei sind Namen immer in einem bestimmten abgeschlossenen Teil des Quelltexts gultig so dass es bei der Bindung nicht zu Uberschneidungen mit zuvor oder kunftig definierten Bindungen kommen kann Da Bindungen in Common Lisp jederzeit erzeugt werden konnen und Uberschneidungen ausgeschlossen sind ist es moglich mit ihrer Hilfe allein durch Funktionsdeklarationen Datenstrukturen zu erzeugen Dabei nutzt man einen Effekt aus den man closure nennt das automatische Einfangen von Bindungen Closures sind Funktionen und ihre Bindungen Mochte man beispielsweise den span class nv my cons span Operator definieren der ein Paar aus zwei Werten erzeugt so konnte man auf die Idee kommen diesen eine anonyme Funktion also einen span class k lambda span Ausdruck zuruckliefern zu lassen die die beiden Werte eingefangen hat und auf Anfrage d h wenn sie mit einem Argument span class nv num span aufgerufen wird einen der beiden zuruckliefert und zwar den ersten Wert fur span class nv num span 0 und sonst den zweiten defun my cons x y lambda num if zerop num x y Man kann die von diesem Operator erzeugten Werte zum Beispiel wie folgt verwenden man beachte span class nb funcall span ist der Operator zum Aufrufen von Funktionen die in Variablen gespeichert sind defvar paar A my cons 100 200 gt paar A defvar paar B my cons paar A 42 gt paar B print funcall paar A 0 gt 100 print funcall paar A 1 gt 200 print funcall paar B 0 gt LAMBDA print funcall funcall paar B 0 1 gt 200 Man beachte hierbei dass die verschiedenen Bindungen von span class vg paar A span und span class vg paar B span fur die Namen X und Y sich nicht uberschneiden sondern fur jeden Aufruf von span class nv my cons span jeweils neu erschaffen werden Es ist auch moglich solche Bindungen nachtraglich zu andern wie der folgende Codeausschnitt zeigt der eine versteckte Bindung namens span class nv zahler span definiert let zahler 0 defun zahler incf zahler defun zahler decf zahler defun hole zahler zahler hole zahler gt 0 zahler gt 1 zahler gt 2 hole zahler gt 2 zahler gt 1 hole zahler gt 1 setf zahler 100 gt Fehler weil zahler nicht global definiert ist Dynamische Bindung und Sondervariablen Bearbeiten Common Lisp unterstutzt immer noch die in fruheren Lisp Dialekten verwendete dynamische Bindung die globale Namen aber zeitlich begrenzt gultige Wertbindungen verwendet Aufgrund der moglichen Namenskonflikte wird diese Art der Wertbindung nur in Sonderfallen verwendet weshalb in diesem Zusammenhang auch von special variables also Sondervariablen gesprochen wird Es ist ublich die Namen von Sondervariablen zwischen zwei Sternchen zu setzen um dem Leser ihre Natur auf einen Blick deutlich zu machen und Konflikte mit lexikalischen Variablen zu vermeiden Der Nutzen von Sondervariablen liegt gerade in ihren zeitlich begrenzten aber globalen Auswirkungen begraben Man kann sie sich auch als eine Form von impliziten Argumenten vorstellen die den gesamten Aufrufsbaum hinab weitergereicht werden ohne auf jeder Ebene explizit genannt werden zu mussen Ein Beispiel macht das Prinzip verstandlicher Nehmen wir an es sei eine Funktion span class nv print date span vordefiniert zum Beispiel in einer Bibliothek eines Drittanbieters die das aktuelle Datum in besonders schoner Form auf die Standardausgabe schreibt Nun mochten wir diese unersetzliche Funktion nutzen aber das Ergebnis stattdessen in eine Datei schreiben Hat nun der Entwickler der Funktion nicht an diese Moglichkeit gedacht und einen entsprechenden Parameter eingebaut konnen wir uns die Tatsache zunutze machen dass die Standardausgabe als Sondervariable definiert ist let standard output ausgabedatei format t amp Das aktuelle Datum ist print date Die Tatsache dass wir span class vg standard output span dynamisch an unsere span class nv ausgabedatei span binden sorgt dafur dass jede Standardausgabe dort landet wo wir sie haben wollen span class k let span sorgt hierbei dafur dass die Bindung nach Beendigung des Blocks wieder auf ihren Ausgangszustand zuruckgesetzt wird Sondervariablen haben einen weiteren interessanten Aspekt der im Falle von Nebenlaufigkeit Spracherweiterung zu ANSI Common Lisp zutage tritt und ihre Implementierbarkeit oberhalb der eigentlichen Sprachebene unmoglich macht oder doch zumindest sehr erschwert Ihre Bindungen sind namlich thread lokal Das heisst dass zwei parallele Programmablaufe die auf denselben Namen zugreifen unterschiedliche Bindungen fur diesen Namen verwenden konnen obwohl Namen von Sondervariablen global sind Der obige Code wurde demnach auch funktionieren wenn zwischen der zweiten und der dritten Zeile ein anderer Thread auf die Idee kame span class vg standard output span an seine eigene Datei zu binden Da die beiden Bindungen voneinander unabhangig sind storen sich die beiden Threads dadurch nicht Man spricht hierbei von Bindungsuberlagerung weil nicht etwa die bestehende Bindung verandert sondern immer neue Bindungen auf die alten aufgelagert und bei Beendigung des span class k let span Blocks wieder heruntergenommen werden Vergleich mit anderen Lisp Dialekten BearbeitenCommon Lisp basiert vor allem auf dem am MIT entwickelten Maclisp Dialekt wurde aber auch stark von Symbolics ZetaLisp InterLisp und Scheme beeinflusst Guy Steele der Vorsitzende des Common Lisp Komitees hatte in den 1970er Jahren zusammen mit Gerald Jay Sussman Scheme entworfen Im Gegensatz zu den meisten anderen Lisp Dialekten welche traditionsgemass ausschliesslich dynamische Variablenbindung verwendeten benutzt Common Lisp hauptsachlich die in Scheme eingefuhrte lexikalische Variablenbindung lexical scope Siehe Abschnitt Variablenbindung Verfugbarkeit von Paketen und Bibliotheken BearbeitenAhnlich wie bei anderen Programmiersprachen zum Beispiel CPAN im Falle von Perl existiert mit ASDF Install 6 eine Sammlung von Common Lisp Modulen die sich automatisch installieren lassen Es gibt zahlreiche Pakete fur die unterschiedlichsten Einsatzgebiete beispielsweise fur Webentwicklung 3D Grafik Textverarbeitung und vieles mehr Auch stehen Bindings fur GUI Toolkits wie GTK Cocoa Microsoft Windows Tk und andere ebenso zur Verfugung wie Implementierungen des Common Lisp Interface Managers kurz CLIM und ein Binding fur das Net Framework Entwicklungsumgebungen Bearbeiten Hauptartikel Vergleich von Common Lisp Implementierungen Sprachen mit S Ausdruck basierter Syntax wie Common Lisp eignen sich dank ihrer syntaktischen Einfachheit besonders fur den Einsatz machtiger Codeanalyse und managementprogramme Ausserdem konnen Entwicklungsumgebungen mit ihnen auf vielfaltige Art und Weise integriert werden bei Bedarf auch bis hin zur Vermengung von Programm und IDE Code Eine weit verbreitete freie Entwicklungsumgebung ist SLIME 7 der Superior Lisp Interaction Mode fur Emacs welcher den ublichen interaktiven Softwareentwicklungsprozess in Common Lisp gut unterstutzt Das Fehlen von Refaktorierungswerkzeugen wird nur von wenigen Lispern als ein grosses Problem angesehen zumal die Sprache selbst mit ihren Makros gute Moglichkeiten dafur auf der Quelltextebene bietet Weiterhin existieren zahlreiche kommerzielle Common Lisp Entwicklungssysteme wie zum Beispiel Allegro Common Lisp von Franz Inc und LispWorks von LispWorks Ltd Literatur BearbeitenANSI INCITS 226 1994 R1999 Der ANSI Standard Guy L Steele Jr Common Lisp The Language Second Edition Prentice Hall ISBN 0 13 152414 3 Weicht vom ANSI CL Standard ab beschreibt nur einen Zwischenstand der Standardisierung Paul Graham ANSI Common Lisp Prentice Hall 1997 ISBN 3 8272 9543 2 Peter Seibel Practical Common Lisp Apress 2005 ISBN 1 59059 239 5 Guter Einstieg in die Common Lisp Programmierung vor allem fur Umsteiger von anderen Programmiersprachen David S Touretzky Common Lisp A Gentle Introduction to Symbolic Computation The Benjamin Cummings Publishing Company 1990 ISBN 0 8053 0492 4 Guter Einstieg in die Common Lisp Programmierung vor allem fur Personen mit keiner oder wenig Programmiererfahrung Edmund Weitz Common Lisp Recipes A Problem Solution Approach Apress 2016 ISBN 978 1 4842 1177 9 Deutschsprachige Bucher Bearbeiten R A Brooks Programmieren in Common Lisp Oldenbourg Wissenschaftsverlag 1987 ISBN 3 486 20269 3 Herbert Stoyan Programmiermethoden der Kunstlichen Intelligenz Band 1 Springer 1988 ISBN 978 3 540 19418 7 Rudiger Esser Elisabeth Feldmar LISP Fallstudien mit Anwendungen in der Kunstlichen Intelligenz Vieweg 1989 ISBN 3 528 04585 X Herbert Stoyan Programmiermethoden der Kunstlichen Intelligenz Band 2 Springer 1991 ISBN 978 3 540 52469 4 Otto Mayer Programmieren in Common Lisp Spektrum Akademischer Verlag 1995 ISBN 3 86025 710 2 Paul Graham ANSI Common Lisp Markt Technik Verlag 1997 ISBN 3 827 29543 2 Conrad Barski Land of Lisp Lisp Programmierung einfach lernen und originelle Spiele programmieren mitp 2011 ISBN 978 3 8266 9163 8 Patrick M Krusenotto Funktionale Programmierung und Metaprogrammierung Interaktiv in Common Lisp Springer Fachmedien Wiesbaden 2016 ISBN 978 3 658 13743 4Weblinks Bearbeitencommon lisp net englisch Heimat vieler OpenSource Common Lisp Projekte Common Lisp Cookbook englisch Awesome cl list englisch Common Lisp HyperSpec englisch Cliki englisch Das Common Lisp Wiki fur Unix und freie Software Paul Grahams Lisp Seite englisch Planet Lisp Blog Aggregator englisch Portacle portable Common Lisp IDE mit Emacs und u a SLIME Quicklisp und SBCL A Road to Common Lisp Tutorial von Steve Losh englisch Einzelnachweise Bearbeiten Richard P Gabriel erwahnt Scott Fahlman als Leiter des Common Lisp Projekts a b Guy L Steele Jr Common Lisp The Language Prentice Hall ISBN 0 13 152414 3 History im Common Lisp HyperSpec abgerufen am 6 November 2016 Paul Graham On Lisp Prentice Hall 1993 ISBN 0 13 030552 9 siehe cliki net Unicode Support englisch cliki net asdf common lisp net Abgerufen von https de wikipedia org w index php title Common Lisp amp oldid 228222086