Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

25
Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111

Transcript of Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

Page 1: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

Programmieren mit LISP

Thomas Trieschmann

Matr.-Nr. 26203111

Page 2: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

Inhaltsübersicht

• 1.: Entstehungsgeschichte LISP• 2.: Datenstruktur LISP• 3.: LISP Werkzeuge• 4.: Anwendungen LISP

– AutoLISP– New LISP– Emacs LISP (ELISP) 5.: Praxisbeispiel

-Verifikation E-Mail Adresse -Idee zur Umsetzung eines weiteren Beispiels

Page 3: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

Entstehungsgeschichte

• Erste Version entsteht in 1950er Jahren• Seitdem viele Varianten• Spezielle Versionen für bestimmte Anwendungen• Seit 1994: COMMON LISP hat ANSI- Standard• Erweiterung: COMMON LISP OBJECT

SYSTEM (CLOS), Zweck: Integration objektorientierter Konzepte in LISP

Page 4: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

Datenstruktur LISP

• Datentypen:– Atome

• Symbole z.B.: SETQ D (näheres später)

• Zahlen z.B.: 1 2 3 ...

– Listen Beispiel siehe whiteboard

• Namensgeber der Sprache:– list processing =>LISP

Page 5: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

Beispiel

• Hauptmerkmal, wenn mit LISP programmiert wird:– Klammernotation

• Hello World:

(Defun c:HelloWorld ()

(princ „\nHello World“

)

Page 6: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

LISP Werkzeuge I

• function z. B.: ( + 3 (* 4 5 ) ) => 23

• if Bedingte Ausführung

• quote verarbeitet

• let Neue Umgebung für lokale Variable ( => Kurvendiskussion)

• progn Führt mehrere Anweisungen nacheinander aus

• setq Einfache Variablenzuweisung (siehe Beispiel

Verifizierung)Es gibt noch viele weitere Funktionen, wie wir auch am späteren Beispiel sehen werden.

Page 7: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

LISP Werkzeuge II

• Arrays und Vektoren (=> lineare Algebra)

• LISP ist eine „programmierbare Programmiersprache“–Makros dienen dazu, LISP-Ausdrücke in

andere LISP Ausdrücke zu transformieren

– Schachtelung bewirkt komplexere symbolische Ausdrücke Beispiel s. whiteboard

Page 8: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

Anwendungen LISP

• Künstliche Intelligenz (Mathematik)

• Mathematische Formelmanipulation

• Für Anwendungsprogramme: Der Dialekt AutoLISP ist

Bestandteil von AutoCAD .

Hiermit lassen sich u.a. geometrische Figuren zeichnen und Abstände berechnen

Page 9: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

New LISP

• Gedacht als Skriptsprache (=> für kleinere und mittlere Aufgaben)

• Verzichtet auf umständliche Verschachtelungen bzw. Implementierungen

• Ist komplett in C geschrieben

• Ziel: Transparenz und Übersichtlichkeit

Page 10: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

Emacs LISP

• Der Dialekt Emacs LISP wird zur Programmierung von Editoren benutzt.

• Als Editoren werden vor allem GNUEmacs und Xemacs verwendet

• Mit Hilfe von Emacs LISP können diese auch erweitert werden.

• Besonderheit: Emacs LISP kann Quelltext in Byte-Code übersetzen (vergleiche Java)=>Zweck: Verringerung Speicherplatz, schnellere

Ausführung

Page 11: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

Anwendung:

• Verifizierung einer E-Mail Adresse

• Vorgehensweise:– 5.1: Prüfung des local-Parts– 5.2: Prüfung des @-Zeichens– 5.3: Prüfung des domain-Parts– 5.4: Prüfung Kürzel am Ende

Page 12: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

5.1.1: Prüfung local Part

• Automatische Umwandlung Kleinschreibung in Großbuchstaben• Grundgerüst: Mit der Funktion POSNLIS werden die Buchstaben

in Zahlen umgewandelt• Dazu: Aufstellung der Buchstabenliste „Alpha“:

(SETQ ALPHA '(ABCD .......XYZ))

Als nächstes: Ein Programm, welches die Liste X aus den Buchstaben des local-Parts einliest und anschließend eine Zahlenliste ausgibt:

(DEFUN POSNLIS (X) ; Name der Liste lautet X((NULLX) NIL) ;Wenn Liste leer ist, beenden(CONS (POSITION (CARX) ALPHA) ;Wandelt Buchstaben nach-

(POSNLIS (CDRX) ))) ;einander um =>Zahlenliste

Page 13: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

5.1.2: Prüf. Sonderzeichen ._-+

• Wie werden die Sonderzeichen geprüft?

(SETQ.'(27)) ; Mit SETQ wird dem (SETQ_'(28)) ; jeweiligen (SETQ-'(29)) ; Sonderzeichen(SETQ+‚(30)) ; eine Zahl zugewiesen

Nun muss noch geprüft werden, dass der local-Part aus 1-64 Zeichen besteht:

Zunächst wird eine Zahlenliste Y definiert, die die Liste X enthält und ggf. die Werte 27, 28, 29,30:

(SETQ Y'(X 27 30))

Page 14: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

5.1.3:Prüfung Sonderzeichen

• Jetzt wird die Anzahl der Elemente in dieser Liste Y gezählt:

(DEFUN LIST-LENGTH'(Y) =>Z) ; Anzahl Elemente heißt Z

Die Prüfung geht noch weiter:

(SETQ A'(1 2 ... 64) ; A wird als variable zw. 1 und 64 definiert

Schließlich wird geprüft, ob Z (tatsächliche Anzahl) in A enthalten ist: (EQ 'A 'Z) => T ; true, Z ist in A enthalten, gültige Länge

(EQ 'A'Z) => NIL ; Falsch, ungültige Länge des local-Parts

EQ ist eine Vergleichsfunktion.

Page 15: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

5.2: Prüfung des @-Zeichens

• Analog zu den Sonderzeichen wird definiert:

(SETQ@ '(31))

• Definition einer Vergleichsliste: (SETQB'(31))

• Durchführen des Vergleichs: (EQ '@'B) => T

oder: (EQ '@'B) => NIL

Page 16: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

5.3.1: Prüfung domain-Part

• Zunächst: Umwandlung von Kleinschreibung in Großbuchstaben erfolgt automatisch (vgl. local-Part)

• Analog zum local-Part: Umwandeln der Buchstaben (nicht -) in eine Zahlenliste:

(SETQ DALPHA '(A B C ... X Y Z)) ; Definition Buchstaben

(DEFUN POSNLIS (D)) ; Name Liste = D((NULL D) NIL) ; Wenn D leer => Ende

(CONS (POSITION((CAR D) DALPHA) ; Alle Buchstaben(POSNLIS (CDR D) ))) ; werden nach-

;einander in Zahlen umgewandelt

Page 17: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

5.3.2: Prüfung der labels

• Zunächst: Prüfung, dass das 1. und letzte Zeichen der labels keine – sind:

• Die Funktion NUMBERP prüft, ob ein Objekt eine Zahl ist:NUMBERP (1.Zeichen label letzte Zeichen der label) =>

T ; Zeichen sind gültigNUMBERP (1.Zeichen label letzte Zeichen der label) =>

NIL ; mindestens ein ungültiges Zeichen

Anschließend: (SETQ-'(29) ; Dem Minuszeichen wird eine Zahl

zugewiesen.

Page 18: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

5.3.3: Prüfung Länge label(s)

• Es wird eine Zahlenliste E definiert, sie enthält die in DALPHA ermittelten Zahlen und ggf. 29 (für -):

(SETQ E'(1 2 3 .... 29))

Die Anzahl der Elemente in wird ermittelt:

(DEFUN LIST-LENGTH‚(E) => W; Die Anzahl der Elemente

heißt W

Ob W eine gültige Anzahl von Zeichen enthält, wird wieder durch Vergleich ermittelt:

(SET F'(1 2 3 .... 63)) ; F ist Variable zw. 1 und 63

Page 19: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

5.3.4: Gültige Länge label?

• (EQ 'F'W) => T ; W liegt in F => label hat gültige Länge

(EQ 'F'W) => NIL ; W liegt nicht in F=> label ist ungültig

5.3.5: Gültige Gesamtlänge des domain-Parts?

Hierfür wird zunächst der Punkt . in eine Zahl umgewandelt:

(SETQ. '(32))

Page 20: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

5.3.5: Gültige Gesamtlänge domain-Part ?

• Jetzt wird wieder eine Liste erzeugt, die alle Zeichen und Buchstaben des domain-Parts in Zahlen umwandelt:

(SETQ GALPHA,(E1 E2 ....E3 31))

Anschließend wird die Anzahl der Elemente in GALPHA ermittelt:

(DEFUN LIST-LENGTH'(GALPHA) => V; Anzahl Elemente = V

Nun: Definition einer Vergleichsvariablen:

(SETQ G'(1 2 .... 255))

Page 21: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

5.3.5: Vergleich

• (EQ'G'V) => T ;V (tatsächliche Zahl Elemente) liegt in G

• (EQ'G'V)=> NIL ; V liegt nicht in G

• 5.3.6: Prüfung auf gültiges Endkürzel

• Zunächst wird dem Punkt eine gültige Zahl zugewiesen:(SETQ.'(256))

Page 22: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

5.3.6: Prüfung Endkürzel

• Jeder gültigen Endung wird ein Zahlenwert zugewiesen:(SETQde'(257)) (SETQcom'(258)) usw.

Anschließend wird eine Vergleichsliste erstellt, die alle gültigen Kürzel enthält:

(SETQH'(256 257 258 ....))

Die tatsächliche Endung der E-mail-Adresse wird nun auch als Liste definiert:

(SETQI'(256 Zahl f. jeweilige Endung)

Page 23: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

5.3.6: Prüfung Endkürzel

• Abschließend erfolgt wieder ein Vergleich:

(EQ'I'H) => T oder (EQ'I'H)=> NIL

Das war die Verifizierung einer E-mail-Adresse

Page 24: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

Weiteres Beispiel:

• Entwickeln eines Programms in LISP• Ziel: Programm soll Periodizität einer

Buchstabenreihe erkennen– BADCFEHGJIL?

– Vorschlag: Buchstaben in Zahlen umwandeln,• In der Reihe Untergruppen bilden• Differenzen in Untergruppen auf Zahlenreihe

untersuchen

Page 25: Programmieren mit LISP Thomas Trieschmann Matr.-Nr. 26203111.

Vielen Dank für die Aufmerksamkeit

• Meine Datenquellen:• Schoffa:„Die Programmiersprache LISP“

• Henning/ Vogelsang: „ Programmiersprachen“

• Association of Lisp Users (http://www.lisp.org/alu/home)