(in-package "USER") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Ein Studentendatenbank verwaltet Name, Vorname, Alter, ;; Hauptfach, Matrikelnummer, ... ;; ;;;USER(7): (setf *student* (list "Meyer" "Petra" 23 "CL" 1138200)) ;;;("Meyer" "Petra" 23 "CL" 1138200) ;;;USER(8): (fourth *student*) ;;;"CL" ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Abstrakte Datentypen kapseln Konstruktion und Zugriff. ;; (defun create-student (&key name vorname alter hauptfach matrikelnummer) (list name vorname alter hauptfach matrikelnummer)) (defun get-name (student) (first student)) (defun get-matrikelnummer (student) (fifth student)) ;;;USER(12): (setf *student* (create-student :name "Meyer" :alter 23)) ;;;("Meyer" NIL 23 NIL NIL) ;;;USER(13): (get-name *student*) ;;;"Meyer" ;; Problem: - Aufwand ;; - kein Typcheck ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Das Macro defstruct definiert: ;; - eine Konstruktorfunktion ;; - Zugriffsfunktionen auf die Slots ;; - eine Kopierfunktion fuer Instanzen ;; - ein Typpraedikat (defstruct person name alter geschlecht) (setf *person* (make-person :name "Meyer" :alter 23)) ;;;USER(15): (person-name *person*) ;;;"Meyer" ;;;USER(16): (person-p *person*) ;;;T ;;;USER(17): (setf *klon* (copy-person *person*)) ;;;#S(PERSON :NAME "Meyer" :ALTER 23 :GESCHLECHT NIL) ;;;USER(18): (setf (person-name *klon*) ;;; "Anders") ;;;"Anders" ;;;USER(19): *klon* ;;;#S(PERSON :NAME "Anders" :ALTER 23 :GESCHLECHT NIL) ;;;USER(20): *person* ;;;#S(PERSON :NAME "Meyer" :ALTER 23 :GESCHLECHT NIL) ;;; Vererbung (defstruct (student (:include person)) hauptfach matrikelnummer) (setf *student* (make-student :name "Meyer" :alter 23 :hauptfach "CL")) ;;;USER(21): (student-p *student*) ;;;T ;;;USER(22): (person-p *student*) ;;;T ;;;USER(23): (student-p *person*) ;;;NIL