u2.lisp

#|
exec sbcl --noinform --load $0 --end-toplevel-options "$@"
|#

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? 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)
  (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)

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*)
YPP2/album/u2.lisp.txt · Last modified: 2014/10/23 23:33 (external edit)
CC Attribution-Noncommercial-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0