;;; ;;; LISP-Code f"ur die R"ucksprache ;;; ;;; Findet die Fehler im Code ;;; und erkl"art bei der R"ucksprache, was falsch ist ;;; und wie ihr es korrigieren w"urdet. ;;; ;;; ;;; Ein abstrakter Datentyp fuer Studierendeninformation: Name (string), ;;; Matrikelnummer (integer) und Hauptfach (symbol); die aktuelle Kodierung ;;; (als dreielementige Liste) wird durch den Konstruktor und individuelle ;;; Zugriffsfunktionen verborgen. ;;; (defun make-student (name matrikel hauptfach) (list name matrikel hauptfach)) (defun student-name (student) (first student)) (defun student-matrikel (student) (third student)) (defun student-hauptfach (student) (second student)) (defparameter *students* (list (make-student "Kermit" 4711 'computerlinguistik) (make-student "Shorty" 4712 'computerlinguistik) (make-student "Lulle" 4713 'computerlinguistik) (make-student "Thekla" 42 'philosophie))) ;;; ;;; Sortiertes Einfuegen: insert() fuegt .item. an die entsprechende Position ;;; in .list. ein; die Ordnung der Listenelemente wird durch die zweistellige ;;; Funktion .test. bestimmt (e.g. #'< fuer numerisch aufsteigende Ordnung); ;;; .key. ist eine Funktion, die vor dem Aufruf von .test. auf .item. und die ;;; einzelnen Listenelemente angewendet wird, um beispielsweise nach einem ;;; bestimmten Feld der Elemente zu sortieren; ist .key. nil, wird .test. auf ;;; die ganzen Objekte angewandt. e.g. ;;; ;;; (insert '4 '(1 2 3 5) #'< nil) ;;; --> (1 2 3 4 5) ;;; (insert '(l 4) '((h 1) (a 2) (l 3) (o 5)) #'< #'second) ;;; --> ((H 1) (A 2) (L 3) (L 4) (O 5)) ;;; (defun insert (item list test key) (cond ((null list) (list item)) (t (let ((ikey (if key (funcall key item) item)) (ckey (if key (funcall (first list) key) (first list)))) (cond ((funcall test ikey ckey) (cons item list)) (t (cons (first list) (insert item (rest list) test key)))))))) ;;; ;;; Restrekursive Sortierfunktion: iteriert ueber den Elementen von .list. und ;;; fuegt sie sortiert (mittels insert()) in eine neue Liste ein. e.g. ;;; ;;; (isort '((0 5) (h 1) (l 4) (a 1) (l 3)) #'< #'second) ;;; --> ((H 1) (A 1) (L 3) (L 4) (0 5)) ;;; (defun isort (list test key) (isort2 list test key nil)) (defun isort2 (list test key result) (cond ((null list) nil) (t (isort2 (rest list) test key (insert (first list) result test key))))) ;;; ;;; Sortierte Uebersicht ueber eine Liste von Studierenden: gibt .students. ;;; formatiert am Bildschirm aus; sortiert wird nach .sort-by. (entweder 'name ;;; oder 'matrikel); e.g. ;;; ;;; (sorted-report *students* 'name) ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Kermit (4711) studiert COMPUTERLINGUISTIK ;;; ;;; Lulle (4713) studiert COMPUTERLINGUISTIK ;;; ;;; Shorty (4712) studiert COMPUTERLINGUISTIK ;;; ;;; Thekla (42) studiert PHILOSOPHIE ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; --> nil ;;; ;;; (sorted-report *students* 'matrikel) ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Thekla (42) studiert PHILOSOPHIE ;;; ;;; Kermit (4711) studiert COMPUTERLINGUISTIK ;;; ;;; Shorty (4712) studiert COMPUTERLINGUISTIK ;;; ;;; Lulle (4713) studiert COMPUTERLINGUISTIK ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; --> nil ;;; (defun sorted-report (students sort-by) (let* ((key (cond ((eq sort-by 'name) #'student-name) ((eq sort-by 'matrikel) #'student-matrikel) (t (format t "sorted-report(): invalid key `~a'~%" sort-by) nil))) (test (cond ((eq sort-by 'name) #'string<) ((eq sort-by 'matrikel) #'<))) (sorted-students (when (and key test) (isort students test key)))) (when sorted-students (dotimes (i 45) (format t ";")) (format t "~%") (dolist (sorted-students) (let ((name (student-name student)) (matrikel (student-matrikel)) (hauptfach (student-hauptfach student))) (format t ";;; ~a (~a) studiert ~a~%" name matrikel hauptfach))) (dotimes (i 45) (format t ";")))))