CommonLisp CommonLisp Grundlegende Datenstruktur: sog. symbolische Ausdrücke (S-Ausdrücke, engl. S-expressions) Zur Geschichte: • Lisp: list processing (language) • Zahlen, z.B. 3.14 oder 4711 • seit [McCarthy 1957] • Symbole, z.B. RESULT oder X11 • verwendet vor allem in Projekten der KI • Zeichenketten, z.B. "ein String" • viele Dialekte: u.a. MacLisp, Interlisp, Zetalisp, Scheme • Zeichen, z.B. #\q • als CommonLisp internationaler ANSI-Standard • Listen von S-Ausdrücken, z.B. (RESULT X11) oder (TIMES (SUM 3 4) (DIFF 3 4)) WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 305 CommonLisp WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 306 Semantik: Auswertung (Evaluation) von S-Ausdrücken Beachte: Jeder S-Ausdruck ist ein syntaktisch legales Lisp-Programm. Darstellung: expression ⇒ value (Programm-Daten-Äquivalenz) Regeln: • Ist der S-Ausdruck eine Zahl, eine Zeichenkette, ein Zeichen, das Symbol T oder das Symbol NIL, dann evaluiert er zu sich selbst. • Ist der S-Ausdruck eine Liste der Form (function arg1 . . . argN), dann werden zunächst die Argumente (arg1 bis argN) ausgewertet und dann wird die Funktion function mit diesen Werten aufgerufen. • ... WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 307 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 308 Semantik: Auswertung (Evaluation) . . . (cont.) Lisp-Programme • ... • müssen nicht kompiliert werden • Ist der S-Ausdruck eine Liste der Form • Interpreter organisiert als sog. read-eval-print-Schleife (reserved-word arg1 . . . argN), • Darstellung in CommonLisp: dann hängt der Wert von der Definition des speziellen Bezeichners reserved-word ab. Diese Definition regelt auch, ob die Argumente ausgewertet werden oder nicht. (LOOP (PRINT (EVAL (READ *STANDARD-INPUT*)) *STANDARD-OUTPUT*)) • Ist der S-Ausdruck ein Symbol, dann ist der Wert der letzte Wert, der mit diesem Symbol verknüpft wurde. Ein Fehler tritt auf, wenn das Symbol mit keinem Wert verknüpft ist. WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 309 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 Kontrollstrukturen 310 Kontrollstrukturen • einfache bedingte Anweisung: IF-THEN-ELSE • ‘einarmige’ Versionen im Format (WHEN test consequent) • Spezialform im Format bzw. (IF test consequent alternate) (UNLESS neg-test consequent) • Beispiel: Definition von Fakultät (defun fak (n) (if (= n 1) 1 (* n (fak (- n 1))))) WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 311 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 312 Kontrollstrukturen Kontrollstrukturen: COND (cont.) • COND: bedingte Anweisung mit Folge von Tests • Auswertung: Tests werden nacheinander solange ausgewertet, bis einer non-NIL; dann werden die Ausdrücke der zugehörigen Klausel ausgewertet; Wert des COND ist der letzte ausgewertete Ausdruck • Spezialform im Format (COND (test1 {expression}*) (test2 {expression}*) ... (testN {expression}*)) • die (testi {expression}*) heissen COND-Klauseln WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 313 Funktionen WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 314 Funktionen (cont.) ein Funktionsaufruf der Form • Definition benannter Funktionen mit Spezialform DEFUN im Format (name expression1 ... expressionN) (DEFUN name ({symbol}*) {expression}*) • die (evtl. leere ) Liste ({symbol}*) enthält die lokalen Variablen der Funktion (auch Parameter oder formale Variable genannt) • führt zur Bindung der Werte der Argumente expression1 bis expressionN an die lokalen Variablen, • dann zur Auswertung der Ausdrücke des Funktionskörpers und • die {expression}* stellen den Körper der Funktion dar • zur Rückgabe des Werts des letzten ausgewerteten Ausdrucks WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 315 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 316 Listen Listen (cont.) rekursive Definition: Selektoren: • die leere Liste (dargestellt als () oder mit dem Symbol NIL) ist eine Liste • CAR liefert das erste Element einer nicht-leeren Liste • Wenn expression ein S-Ausdruck und list eine Liste ist, dann ist auch der Wert von (CONS expression list) eine Liste • CDR liefert den Rest einer Liste, d.h. die Liste ohne das erste Element Beachte: CONS . . . Konstruktor • für jede nicht-leere Liste list gilt die folgende Beziehung: (CONS (CAR list) (CDR list)) = list WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 317 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 Listen: weitere Funktionen 318 Listen: weitere Funktionen Aneinanderhängen von Listen: APPEND Elemente zu Liste zusammenfügen: LIST • APPEND nimmt zwei oder mehr Argumente, deren Werte alle (ggf. leere) Listen sein müssen, und gibt diejenige Liste zurück, die durch Aneinanderhängen der Werte der Argumente entsteht • LIST nimmt ein oder mehrere Argumente und gibt diejenige Liste zurück, die die Werte dieser Argumente als Elemente enthält • Beispiele: • Beispiele: (LIST 1 2 3) => ... (APPEND ’(1 2) ’(3 4)) => ... (LIST ’(1 2) ’(3 4)) => ... (APPEND ’(1) ’(2 (3) 4)) => ... (LIST ’A ’(B C) ’(D)) => ... (APPEND ’(1 2) NIL) => ... WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 319 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 320 Quotieren: Verhindern der Auswertung Quotieren: Verhindern der Auswertung • soll die Auswertung eines S-Ausdrucks unterbleiben, so muss er ‘quotiert’ werden • der Lisp-Reader wandelt Vorkommen ’expression • Spezialform: QUOTE beim Verarbeiten von Eingaben um in • das Argument wird unausgewertet zurückgegeben, d.h. (QUOTE expression) (QUOTE expression) => expression • Beispiel: • wegen der häufigen Verwendung gibt es mit ’ eine abgekürzte Schreibweise (LIST ’(1 2) ’(3 4)) gelesen als ... (LIST ’A ’(B C) ’(D)) gelesen als ... WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 321 Rekursion über Listen WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 322 Rekursion über Listen: LENGTH • viele Funktionen auf Listen nutzen die rekursive Definition dieser Datenstruktur • mögliche Verwendung: (LENGTH ’(A B C)) => ... • Beispiel: Funktion LENGTH zur Berechnung der Länge einer Liste (LENGTH (APPEND ’(1 2) ’((3 4)) ’(5))) => ... • mögliche Definition: (LENGTH (CONS ’(A B) ’(C D E))) => ... (DEFUN LENGTH (LIST) (IF (NULL LIST) 0 (+ 1 (LENGTH (CDR LIST))))) WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 (LENGTH ’(CONS ’(A B) ’(C D E))) => ... 323 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 324 Funktionen höherer Ordnung Funktionen höherer Ordnung (cont.) • Beispiel: MAPCAR • MAPCAR ermöglicht, eine (einargumentige) Funktion auf alle Elemente einer Liste anzuwenden; Wert ist die Liste der Funktionswerte • allgemeiner Fall: MAPCAR nimmt eine n-stellige Funktion und n Listen als Argumente; die Funktion wird solange nacheinander auf jeweils korrespondierende (d.h. an gleicher Position sich befindende) Elemente der Listen angewendet, bis (mind.) eine der Listen leer ist; Wert ist die Liste der Funktionswerte • Beispiel: • Beispiel: (DEFUN SQUARE (N) (* N N )) (MAPCAR #’MIN ’(4 7 1 1) ’(0 8 15)) => ... (MAPCAR #’SQUARE ’(1 2 3 4 5)) => ... (MAPCAR #’MAX ’(4 7 1 1) ’(0 8 15)) => ... WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 325 Funktionen höherer Ordnung (cont.) WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 326 Funktionen höherer Ordnung (cont.) • FUNCALL . . . nimmt beliebig viele Argumente; das erste Argument muss zu einer Funktion evaluieren; die Werte der restlichen Argumente werden an diese Funktion übergeben • mögliche Definition von MAPCAR (einargumentiger Fall): (DEFUN MAPCAR (F L) (IF (NULL L) NIL (CONS (FUNCALL F (CAR L)) (MAPCAR F (CDR L))))) • Beispiel: Funktionskomposition (defun compose (f g) #’(lambda (x) (funcall f (funcall g x)))) • beachte Unterschied zu Scheme • in Scheme kein FUNCALL erforderlich: • CommonLisp unterscheidet zwischen Wert und Funktionswert eines Symbols WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 327 (define (compose f1 f2) (lambda (x) (f1 (f2 x)))) WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 328 Funktionen höherer Ordnung (cont.) Funktionen höherer Ordnung (cont.) weitere Beispiele: weitere Beispiele: • MAPCAN . . . wie MAPCAR, aber Ergebniswerte (die Listen sein müssen) werden aneinandergehängt • EVERY . . . trifft Prädikat auf alle Elemente einer Liste zu? (EVERY #’EVENP ’(2 4 6)) => ... (MAPCAN #’REVERSE ’((1 2 3)(A B)(4 7 11))) => ... • SOME . . . trifft Prädikat auf mindestens ein Element einer Liste zu? • MAPC . . . wie MAPCAR, aber gibt die als zweites Argument übergebene Liste als Wert zurück WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 329 (SOME #’EVENP ’(2 3 4 5 6)) => ... WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 Anonyme Funktionen 330 Anonyme Funktionen • oft wird eine Funktion nur lokal als Argument einer Funktion höherer Ordnung benötigt • LAMBDA-Ausdrücke erlauben die Darstellung anonymer, d.h. unbenannter Funktionen • Beispiele: (MAPCAR #’(LAMBDA (N) (* N N)) ’(2 4 6 8)) => ... (MAPCAR #’(LAMBDA (N M) (max (abs (- N M)) (+ n m))) ’(4 7 1 1) ’(0 -8 15)) => ... • Syntax: (LAMBDA ({symbol}*) {expression}*) (EVERY #’(LAMBDA (N) (> N 5)) ’(2 4 6 8)) => ... (SOME #’(LAMBDA (N) (> 5 N)) ’(2 4 6 8)) => ... WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 331 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 332 Umgang mit funktionalen Argumenten: Umgang mit funktionalen Argumenten: APPLY Wie kann ein als Argument übergebenes Funktionsobjekt ‘aufgerufen’ werden? • APPLY . . . zwei Argumente: Wert des ersten ist ein Funktionsobjekt, Wert des zweiten ist eine Liste • das Funktionsobjekt wird auf die Elemente der Liste als Argumente angewendet • gleichwertig sind: (+ 1 2) (apply #’+ ’(1 2)) (apply (symbol-function ’+) ’(1 2)) (apply #’(lambda (x y) (+ x y)) ’(1 2)) • Wert eines Aufrufs von APPLY ist dann der bei Anwendung des Funktionsobjekts auf die Argumente sich ergebende Wert WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 333 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 Umgang mit funktionalen Argumenten Umgang mit funktionalen Argumenten • FUNCALL . . . mindestens zwei Argumente: Wert des ersten ist ein Funktionsobjekt, die Werte aller anderen Argumente sind Argumente für das Funktionsobjekt • Wert eines Aufrufs von FUNCALL ist dann der bei Anwendung des Funktionsobjekts auf die Argumente sich ergebende Wert • gleichwertig sind: (+ 1 2) (funcall #’+ 1 2) (funcall (symbol-function ’+) 1 2) (funcall #’(lambda (x y) (+ x y)) 1 2) WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 334 335 Wichtiger Unterschied: dynamischer vs. lexikalischer Skopus KPWR(108): 5 KPWR(109): FU1 KPWR(110): FU2 KPWR(111): 11 KPWR(112): 9 (setq x 5) (defun fu1 (x)(funcall ’(lambda (y) (+ x y)) 6)) (defun fu2 (x)(funcall #’(lambda (y) (+ x y)) 6)) (fu1 3) (fu2 3) WS 2006/2007, Programmierkonzepte und Modellierung (PKM), © Prof. Dr. D. Rösner; erstellt: 16. Januar 2007 336