Common LISP - Eine Allgemeine Ubersicht¨
Total Page:16
File Type:pdf, Size:1020Kb
Common LISP - Eine allgemeine Ubersicht¨ Martin Elshuber∗ 24. November 2004, Wien Abstract ausreichend sein um Funktionen berechenbar zu machen, λ-Ausdrucke¨ zur Funktionsbenen- Common LISP ist eine sehr vielseitige nung, Repr¨asentation von LISP-Programmen Programmiersprache. Dieser Artikel soll als LISP-Daten, die LISP-Funktion EVAL dient einen kurzen Uberblick¨ uber¨ Common sowohl als formale Definition als auch als LISP liefern. Zuerst gebe ich einen Uber-¨ Interpreter[3]. blick uber¨ die Geschichte von Common Aus LISP haben sich nun viele andere Dia- Lisp. Als n¨achsten Punkt beschreibe ich lekte entwickelt, von den die gr¨oßten sicherlich die Syntax von Common LISP sowie die MacLISP und InterLISP waren. Weiters exis- wichtigsten Befehle. Abschließend wer- tierten noch Franz LISP und Spice Lisp. den die Besonderheiten von Common Im April 1981 lud ARPA alle Enwicklungs- LISP beschrieben, sowie einige Anwen- gruppen von LISP zum “Lisp Community Mee- dungsbeispiele erw¨ahnt. ting” ein, um die Zukunft von LISP zu disku- tieren. Man kam zum Entschluß daß ein neu- er Dialekt “Common LISP” entwickelt werden 1 Geschichte und Motivation sollte. Dieser neue Dialekt sollte folgende Ziele erfullen.¨ Common LISP entstand in den achtziger Jah- ren aus Nachfolgern der Programmiersprache • Allgemeinheit: Common LISP soll als LISP. LISP wurde von John McCarthy in allgemeiner Dialekt gelten. In der Ver- den 50 Jahren erstmals definiert. Er woll- gangenheit fuhrten¨ Unterschiede zwischen te eine Sprache definieren die durch folgen- einzelnen MacLISP Dialekten oft zu In- de Ideen charakterisiert wird: rechnen mit kompatibilit¨aten. symbolischen Ausdrucken¨ und nicht mit Zah- len, Repr¨asentation von Symbolischen Aus- • Portabilit¨at: Common LISP sollte kei- drucken¨ und anderen Informationen als Lis- ne Features enthalten die nicht einfach tenstruktur im Speicher eines Computers, eine auf den meisten Hardwaresystemen imple- kleine Anzahl von Selektions- und Konstruk- mentiert werden k¨onnen. tionsoperationen, Kompositionsfunktionen als Werkzeug um komplexere Funktionen zu bil- • Konsistenz: Die meisten LISP Im- den, Bedingungsausdrucke¨ um Verzweigungen plementationen waren inkonsistent. Das ¨ in Funktionsdefinitionen zu erlauben, rekursive heißt, das der Ubersetzer und der Inter- Benutzung von Bedingungsausdrucken¨ sollen preter einem korrekten Code unterschied- liche Semantik zuweisten. In Common ∗MatNr. 9825286, e-mail: [email protected] LISP soll dieses Problem behoben werden. 1 • Ausdruckskraft: Konstrukte die sich in Obwohl es so aussieht als sei Common LISP alten Implementationen bew¨ahrt haben nicht Case-Sensitiv ist das nicht ganz korrekt. sollen beibehalten werden und schlechte Intern sind alle Funktionen groß geschrieben Konstrukte sollen aus gesiebt werden. definiert (zum Beispiel CDR, CONS, . ). Man kann sie allerdings auch mit (cdr ’(a b)) • Kompatibilit¨at: Common LISP soll aufrufen. Das liegt daran, daß der Interpre- kompatibel sein mit MacLISP und Inter- ter alle Zeichen in Großbuchstaben umwandelt, LISP etwa in dieser Reihenfolge. es sei den sie sind besonders gekennzeichnet. • Effizienz: Es sollte m¨oglich sein ein op- Mehr dazu im Abschnitt Symbole. timierenden Compiler fur¨ Common LISP Variablen in LISP sind grundstzlich typen- zu schreiben. los. Man kann ihnen allerdings Typen zuwei- sen, was speziell dem Ubersetzer¨ hilft besseren • Power: Common LISP sollte es erm¨ogli- Code zu erzeugen. chen Pakete zu erstellen und einzubinden aber keine bereitstellen. 2.2 Basistypen • Stabilit¨at: Nachdem Common LISP ein- Ich werde in den n¨achsten Abs¨atzen die wich- mal definiert wurde, sollte es sich nur noch tigsten Datentypen die Common LISP verwen- langsam und mit bed¨achtig ¨andern det kurz erl¨autern. In Common LISP gibt es folgende Basistypen. Definitiv keine Ziele sind[2] • integer • Grafik: Grafik Programme tendieren da- zu sehr Umgebungs abh¨angig zu sein. Dar- • ratio um spezifiziert Common LISP keine Gra- fik Befehle. • short-float • Multiprocessing: Obwohl einige geplan- • single-float te Implementationen Hilfsmittel bereit- stellen werden, ist Common LISP nicht fur¨ • double-float Multiprocessing vorgesehen. • long-float • Objekt orientiertes Programmieren: • float standard Gleitkommatyp, ublicher-¨ Objekt orientiertes Programmieren ist fur ¨ weise gleich single-float Common LISP nicht vorgesehen • complex 2 Syntax uns Semantik • character 2.1 Allgemeines ;integer Zahlen In den folgenden Abs¨atzen werde ich versu- 0 ; Zero chen die wichtigsten Aspekte der Syntax und −0 ;das gleiche Semantik von Common LISP dar zu stellen. #16 r f f ;255 Ausfuhrliche¨ Information zur Syntax und Se- #16rFf ;255 Common LISP ist mantik k¨onnen im Buch Common Lisp the ni c ht Case−S e n s i t i v e Language[5] nachgeschlagen werden. #12r2a ; −(2∗10ˆ12+11∗10ˆ0) = 34 2 ; r a t i o s namen auch durch zwei ’|’ umklammern. Das 2/3 ; bedeutet das die umklammerten Zeichen genau #2r10/11 ;2/3 so bleiben wie sie sind. ; f l o a t s abcdefg ;Das Symbol mit dem Namen −0. ;0.0 standard float ”ABCDEFG” 2.5s1 ;25.0 shoart−f l o a t AbCdEfG ; das Gleiche ; complex \ abcdefg ;Das Symbol mit #C( 3 . 6 4 2 l −2 −2.435d24) ;complexe dem Namen ”aBCDEFG” zahl | abcdefg | ;Das Symbol mit ; c h a r a c t e r dem Namen ” abcdefg ” #\n ;Zeichen ’n’ #\SPACE ;Zeichen ’ ’ 2.5 Die Symbole NIL und T 2.3 Conses, Listen und S- Das Symbol NIL beschreibt eine Leere Lis- Expressions te. Weiters wird es benutzt um boolsche Aus- Ein cons besteht aus zwei Elementen die car drucke¨ zu evaluieren (= 0 1) ⇒ NIL. Das und cdr genannt werden und wird notiert als Symbol T ist definiert als (not nil) ⇒ T (<car> . <cdr>) (die beiden Leerzeichen vor n i l ;=>NIL und nach dem Punkt sind relevant). Eine Liste t ;=>T wird Rekursiv definiert. Sie ist entweder eine ( not n i l ) ;=>T leere Liste nil oder ein cons dessen cdr ei- ( not 1) ;=>NIL ne Liste ist. Also ist eine Liste eine Kette von (= 1 2) ;=>NIL consen mit einem terminierenden nil[4]. Ei- ne Liste wird mit einer umkammerten durch Leerzeichen separierte Liste notiert. 2.6 Programmstruktur (4 . 2) ;ein cons mit car=4 und Ein Programm in Common LISP besteht aus cdr=2 einer Folge von formen. Ein form ist einfach ein (4 . (2 . nil)) ;das gleiche wie Datenobjekt das evaluiert werden soll. 2 ⇒ 2 (4 2) also eine Liste und (* 3 4) ⇒ 12 ( ⇒ bedeutet evaluiert zu). Alle in Common LISP darstellbaren Ausdrucke¨ Symbole werden in Common LISP als Namen sind sind S-Expressions. Eine S-Expression ist fur¨ Variablen und ¨ahnliches verwendet. Nach- entweder ein atom oder ein cons dessen car dem man (setq v 5) ausgefuhrt¨ hat evaluiert und cdr wieder eine S-Expression darstellen. v ⇒ 5. Ist das Datenobjekt eine Liste so no- tiert das erste Element einen Funktionsnamen 2.4 Symbole und die Restlichen die Funktionsparameter. Symbole dienen in LISP als Namen fur¨ Va- 2.7 Wichtige Funktionen riablen, Funktionen, Makros . Notiert wer- den sie einfach durch den Symbolnamen. Soll • quote: Eine der am h¨aufigsten verwende- ein Symbolname ein Sonderzeichen oder einen ten Funktion ist (quote x) ⇒ x. Diese Kleinbuchstaben enthalten, so ist ein ’\’ vor- Funktion evaluiert einfach zu x ohne das zustellen. Weiters kann man ein einen Symbol- x ausgewertet wird. Da quote sehr h¨aufig 3 verwendet wird kann man es durch ’x • loop <rumpf>:Fuhrt¨ eine Endlosschleife abkurzen.¨ aus die mit return unterbrochen werden kann. ( quote x ) ;=> x (setq a 10) ’(a 65) ;=> ( a 65) 3 Anwendungen (setq a 10) (list a 65) ;=> (10 65) Common LISP wurde in mehreren wirt- schaftlich orientierten Projekten erfolgreich angewandt allen voran die Yahoo! Sto- • list [a1 [a2 [...]]]: Evaluiert nach re web-commerce Internetseite. Weiters sind der Liste die die Parameter als Elemente erw¨ahnenswert: hat. (list 1 2 3 4) ⇒ (1 2 3 4) • Mirai: Izware LLC’s 2D/3D Graphic Pro- • car <cons> / cdr <cons>: Diese beiden gramm Funktionen liefern das car beziehungs- weise des cdr eines cons. Da eine Lis- • Xanalys Corp’s Investiagtions-Software: te durch eine Verkettung cons dargestellt Diese Programmlinie wird weltweit von wird evaluiert (car ’(a1 a2 ... an)) Polizei und Sicherheitsdiensten verwen- mit a1 und (cdr ’(a1 a2 ... an)) mit det. (a2 ... an) • ICAD: Eine der fuhrenden¨ Softwarepakte fur¨ mechanisches Design • cons <car> <cdr>: cons evaluiert zum Cons (<car> . <cdr>) Auch in der open-source Gemeinde wird Common LISP verwendet. • setq <Symbol> <Ausdruck>: Bindet das eine Variable an einen Wert. (setq a 13) • Maxima: Ein Computer Algebra System bindet das Symbol A an den Ausdruck 13. • Compo ist eine Sprache in der man kom- plexe musikalische Strukturen naturlich • defun <Name> (<Parameter>) <Rumpf>: ¨ Definiert eine neu Funktion. Der Name beschreiben kann kann ein beliebiges Symbol sein, die Para- Die NASA verwendet Common LISP Pro- meter sind eine Liste aus Symbolen. Der gramme wie zum Beispiel: Rumpf ist dann eine Folge von formen. Wobei das Ergebnis der form gleichzeitig • SPIKE: Das Zeitplanungs-System fur¨ das das Ergebnis der Funktion ist. Hubble Weltraumteleskop • Remote Agent: Gewinner der NASA Soft- • if <Bedingung> <Rumpf1> <Rumpf2>: ware of the Year Auszeichnung 1999 Wenn die Bedingung ungleich NIL ist dann evaluiert dieses Form zu Rumpf 1 ansonsten zu Rumpf2. 4 Besonderheiten • cond ((<b1> <R1>) ... (<bn> <Rn>)): • typenlose Variablen: Eine der Beson- Die Bedingungen werden der Reihe nach derheiten von Common LISP ist, daß es ausgewertet. und der Erste Zweig der typenlose Variablen verwendet. Es ist al- nicht NIL ausgefuhrt.¨ lerdings m¨oglich eine Variable auf einen 4 speziellen Typ zu restriktieren. Dies fuhrt¨ In einem Vergleichstest zwischen LISP, Java, im allgemeinen zu einer Performacesteige- C und C++ schneidet LISP sehr gut ab[1]. rung des Programms, speziell wird es dem Zahlentypen wie ratio oder bignum machen Ubersetzer¨ erleichtert Optimierungen vor- Common LISP praktikabel fur¨ allerlei numeri- zunehmen. sche Rechenaufgaben. • komplexe Zahlentypen: Common Lisp definiert Datentypen wie bignum oder Literatur ratio die es erm¨oglicht mit komplexen Zahlenformaten effektiv zu rechnen. Ein [1] Erann Gat. Point of view: Lisp as an al- Programm wie zum Beispiel ternative to java.