View
113
Download
2
Category
Preview:
Citation preview
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
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
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
Beispiel
• Hauptmerkmal, wenn mit LISP programmiert wird:– Klammernotation
• Hello World:
(Defun c:HelloWorld ()
(princ „\nHello World“
)
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.
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
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
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
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
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
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
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))
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.
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
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
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.
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
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))
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))
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))
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)
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
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
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)
Recommended