to get the file

Werbung
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
Herunterladen