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 (
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
• cond ((
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. Intelligence, 11(4):21–24, 2000. (defun factorial(x) ( i f (= x 0) [2] Jr. Guy L. Steele. An overview of common 1 lisp. In Proceedings of the 1982 ACM sym- (∗ x (factorial (− x 1) ) ) posium on LISP and functional program- )) ming, pages 98–107. ACM Press, 1982. ( f a c 1000) [3] Jr. Guy L. Steele and Richard P. Gabriel. stellt fur¨ Common LISP kein Problem dar. The evolution of lisp. In The second ACM Auch das exakte rechnen mit Bruchen¨ ist SIGPLAN conference on History of pro- m¨oglich (+ 1/7 1/3) ⇒ 10/21 gramming languages, pages 231–270. ACM Press, 1993. • Symbolisches Auswerten: Dies ist der Grund warum Lisp sehr oft fur¨ Anwen- [4] John McCarthy. Lisp: A programming sys- dungen in der AI verwendet wird. tem for symbolic manipulations. Preprints of papers presented at the 14th national • S-Expressions: Einheitliche Repr¨asenta- tion aller beliebigen Datentypen sowie meeting of the Association for Computing auch der Code durch S-Expressions[4] Machinery, 1959. [5] Guy L. Steele. Common Lisp the Language, 5 Zusammenfassung 2nd edition. 1990.
Common LISP durchaus eine Alternative zu den allgemein bekannten Sprachen wie C, Ja- va oder Pascal. Die vielen Klammern stellen fur¨ Einsteiger sicher ein großes Problem dar und wenn man Common LISP verwenden will muß man damit rechenen (gerade als Einstei- ger) einiges der Debugzeit in Klammerz¨ahlen zu investieren. Dieser Nachteil ist aber auch gleichzeitig ein Vorteil. Dadurch das die Syntax sehr einfach ist - ein Programm ist ja in Wirklichkeit auch eine S-Expression - kann man leichter effizien- tere Ubersetzer¨ und Interpreter zu schreiben.
5