======u2.lisp====== #| exec sbcl --noinform --load $0 --end-toplevel-options "$@" |# [[clhs>Body/m_defcla.htm#defclass|defclass]] funguje :type? (defclass time-spec () ( (min :type (integer 0)) (sec :type (integer 0 59)) )) (defmethod t-min ((self time-spec)) (slot-value self 'min)) kontrola: je value nezaporny integer? typespec, todo vyzkouset type-check (defmethod set-min ((self time-spec) value) (unless (typep value '(integer 0)) (error "minuty: cele nezaporne cislo!")) (setf (slot-value self 'min) value) self) (defmethod t-sec ((self time-spec)) (slot-value self 'sec)) kontrola: je value integer 0-59? (defmethod set-sec ((self time-spec) value) (unless (typep value '(integer 0 59)) (error "sekundy 0-59!")) (setf (slot-value self 'sec) value) self) (defmethod time-in-seconds ((self time-spec)) (+ (* (slot-value self 'min) 60 ) (slot-value self 'sec))) kontrola: je value integer? [[clhs>Body/f_mod_r.htmBody/f_mod_r.htm|mod]]ulo funkce floor a multi/values!!! (defmethod set-time-in-seconds ((self time-spec) value) (unless (typep value '(integer 0)) (error "sekundy zaporne!")) (multiple-value-bind (min sec) (floor value 60) (set-sec (set-min self min) sec))) (defun make-time (min sec) (set-sec (set-min (make-instance 'time-spec) min) sec)) #|testiky (defvar *x*) (setf *x* (make-instance 'time-spec)) (set-min *x* 3) (set-sec *x* 30) (inspect *x*) (time-in-seconds *x*) (make-time 5 15) (inspect *) |# (defclass track () ( name (len :type 'time-spec) )) (defmethod name ((self track)) (slot-value self 'name)) (defmethod set-name ((self track) value) (setf (slot-value self 'name) value) self) (defmethod len ((self track)) (slot-value self 'len)) (defmethod set-len ((self track) value) (unless (typep value 'time-spec) (error "delka stopy neni time-spec!")) (setf (slot-value self 'len) value) self) [[clhs>Body/22_c.htm|format]] (defmethod print-track ((self track)) (format t "~A~1,40T~2D:~2D~%" (name self) (t-min (len self)) (t-sec (len self)))) (defun make-track (name-value len-value) (set-len (set-name (make-instance 'track) name-value) len-value)) #| (defvar *track*) (setf *track* (make-track "Pharaon Dance" (make-time 3 20))) (name *track*) (len *track*) (t-min (len *track*)) (t-sec (len *track*)) (print-track *track*) (set-name *track* "New Name") (name *track*) |# ======album====== (defclass album () ( artist title (tracks :type '(list track)) year-of-release )) (defmethod artist ((self album)) (slot-value self 'artist)) (defmethod set-artist ((self album) value) (setf (slot-value self 'artist) value) self) (defmethod title ((self album)) (slot-value self 'title )) (defmethod set-title ((self album) value) ;kontrola? (setf (slot-value self 'title) value) self) (defmethod tracks ((self album)) (slot-value self 'tracks)) (defmethod set-tracks ((self album) value) (unless (every (lambda (e) (typep e 'track)) value) (error "neni seznam traku!")) (setf (slot-value self 'tracks) value) self) (defmethod year-of-release ((self album)) (slot-value self 'year-of-release)) (defmethod set-year-of-release ((self album) value) (unless (typep value '(integer 1900)) (error "spatny rok vydani")) (setf (slot-value self 'year-of-release) value) self) (defmethod track-count ((self album)) (length (tracks self))) (defmethod album-length ((self album)) (let ((seconds 0)) (dolist (track (tracks self)) (incf seconds (time-in-seconds (len track))) ) (set-time-in-seconds (make-time 0 0) seconds) )) (defun make-album (artist title tracks yrelease) (let ((self (make-instance 'album))) (set-artist self artist) (set-title self title) (set-tracks self tracks) (set-year-of-release self yrelease) self)) (defmethod print-album ((self album)) (let ((total-length (album-length self))) (format t "~A by ~A, released ~D~%~%" (title self) (artist self) (year-of-release self)) (dolist (track (tracks self)) (print-track track)) (format t "Total length:~D:~2D~%" (t-min total-length) (t-sec total-length)) )) #| |# (defvar *album* (make-album "Miles Davis" "Bitches Brew" (list (make-track "Pharaoh's Dance" (make-time 20 05)) (make-track "Bitches Brew" (make-time 26 58)) (make-track "Spanish Key" (make-time 17 32)) (make-track "John McLaughlin" (make-time 4 22)) (make-track "Miles Runs the Voodoo Down" (make-time 14 01)) (make-track "Sanctuary" (make-time 10 56)) (make-track "Feio" (make-time 11 49)) ) 1969)) (track-count *album*) (tracks *album*) (album-length *album*) (print-album *album*)