Tipy, návod na řešení u2
TODO: zaadit do idiomů
(defclass time-spec () ( (min :type (integer 0)) (sec :type (integer 0 59)) ))
getter je obvyklý, vrátí hodnotu slotu
(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) ;settery vracejí self -- volání se dají "řetězit"!!! (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? modulo 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);multiple!!! floor vrací values!!! (set-sec (set-min self min) sec)))
helper, vytvoří instanci a nastaví sloty minut a sekund
(defun make-time (min sec) (set-sec (set-min (make-instance 'time-spec) min) sec))
dál je to už na jedno brdo, album může u set-tracks použít:
#| ... (unless (every (lambda (e) (typep e 'track)) value) (error "neni seznam traku!")) |# #|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 *)
|#
zaverecný test:
#| (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*) |#