Grundkurs Common-Lisp WS 96|97

10. Übung (29-jan-98)



Datenabstraktion (4 Punkte)

Wir basteln uns eine (relationale) Datenbank; es sollen drei verschiedene Arten von Datensätzen gespeichert werden:
StudentIn
Matrikelnummer Name Hauptfach Semester
4711 Kermit ComputerLangustik 3
4711 Shorty ComputerLangustik 7
4713 Lulle ComputerLangustik 13
42 Thekla Philosophie 21

Kurs
Kursnummer Titel DozentIn
1 Blüte der Donaumonarchie Krenn
2 Seemanntick Pinkal
3 Radwandern in Oberfranken Saurer
hört
Matrikelnummer Kursnummer
4711 1
4711 2
4711 3
4712 1
4712 2
4713 2
4713 3
42 3
42 2
42 1
Repräsentiere den abstrakten Datentyp mit Hilfe von assoc-Listen; schreibe geeignete Konstruktor- und Zugriffsoperatoren, e.g.
? (make-studentIn :matrikelnummer 4711 :name "Kermit" 
                  :hauptfach "ComputerLangustik" :semester 5) 
? (setf *kurse* (list 
                  (make-kurs :kursnummer 1 :dozentIn "Krenn" 
                             :titel "Bluete der Donaumonarchie") 
                  (make-kurs :kursnummer 2 :dozentIn "Pinkal" 
                             :titel "Seemanntick") 
                  ...))
? (kurs-titel (third *kurse*))
"Radwandern in Franken"
? (hoert-kursnummer (fifth *hoert*))
2
? (get-field :name (fourth *studentInnen*))
"Thekla"



Bedingte Selektion einzelner Datensätze (6 Punkte)

Schreibe eine Funktion select(), die aus einer Relation (i.e. einer Menge von Datensätzen) alle Datensätze heraussucht, die in einem ihrer Felder eine beliebige Bedingung (die als optionales Funktional übergeben wird; default ist equal()) erfüllen, e.g.
? (select
    (select *studierende* :semester 4 :test #'>) 
    :hauptfach "ComputerLangustik")
um alle StudentInnen mit Hauptfach CL auszuwählen, die ihr Vordiplom abgelegt haben (sollten).



Bildung komplexer Datensätze (6 Punkte)

Schreibe eine zweistellige Funktion combine(), die zwei Datensätze verschiedenen Typs zu einem neuen (komplexen) Datensatz kombiniert, in dem alle Felder der beiden ursprünglichen Datensätze genau einmal enthalten sind, e.g.
(combine
Matrikelnummer Name Hauptfach Semester
4711 Kermit ComputerLangustik 3
Matrikelnummer Kursnummer
4711 1
)

Matrikelnummer Name Hauptfach Semester Kursnummer
4711 Kermit ComputerLangustik 3 1


Für Felder, in denen sich die beiden Eingabedatensätze überschneiden, prüft combine() sicherheitshalber, ob die zugehörigen Werte gleich sind (wie im obigen Beispiel); wenn nicht, gibt combine() eine qualifizierte Fehlermeldung aus (mit format()) und liefert nil als Rückgabewert.

Fehlermeldungen sollten im allgemeinen möglichst genau den aktuellen Kontext und die Fehlerursache beschreiben; im Beispiel von combine() bietet es sich an, den Funktionsnamen (als Kontext, in dem der Fehler aufgetreten ist) sowie den Namen des gemeinsamen Feldes zusammen mit den unterschiedlichen Werten auszugeben.



Abgabetermin ist der 5-feb-98

lisp-aufgaben@coli.uni-sb.de