======Úkol č. 2 – Evidence alb======
Cílem prvního úkolu je implementovat jednoduchou evidenci alb, podobnou té, kterou jste
řešili v předmětu PP1. Při řešení dodržujte principy, se kterými jsme se dosud seznámili.
[[idiom]]
[[u2.lisp]]
Podrobnosti:
Všechny metody, které něco nastavují, musí
* testovat správnost vstupu
* a jako výsledek musí vracet instanci, ve které došlo ke změně.
======time-spec======
Implementujte třídu [[#time-spec]] pro reprezentaci času, pro účely evidence délky skladby.
Třída bude obsahovat sloty **min** a **sec**.
Metody:
* t-min, t-sec pro zjištění minut, resp sekund
* set-min, set-sec pro nastavení minut, resp. sekund.
* time-in-seconds, set-time-in-seconds pro zjištění, resp. nastavení času v sekundách.
Napište si též pomocnou funkci make-time, která vyrobí instanci a nastaví hodnoty slotů.
Příklady volání:
CL-USER 10 > (setf *x* (make-instance 'time-spec))
#
CL-USER 11 > (set-min *x* 3)
#
CL-USER 12 > (set-sec *x* 30)
#
CL-USER 13 > (inspect *x*)
# is a TIME-SPEC
MIN
3
SEC
30
CL-USER 15 : Inspect 1 > :q
#
CL-USER 16 > (time-in-seconds *x*)
210
CL-USER 17 > (make-time 5 15)
#
CL-USER 18 > (inspect *)
# is a TIME-SPEC
MIN
5
SEC
15
======Třída track======
Třída track bude reprezentovat skladbu a bude obsahovat
* sloty name pro název skladby
* a len pro délku skladby. Délka skladby bude instancí třídy [[#time-spec]].
* Napište metody name a len pro čtení příslušných slotů
* a metody set-name a set-len pro nastavování slotů.
* Napište metodu print-track, která vytiskne informace o skladbě. Pro tisk použijte
funkci format. Jak formátovací řetězec můžete použít například "~A~1,40T~2D:~2D~
%" – nastudujte v [[CLHS>format]], co znamená a případně si jej upravte dle potřeby.
Napište pomocnou funkci make-track, podobně jako make-time u času.
Příklady volání:
CL-USER 31 > (make-track "Pharaoh Dance" (make-time 3 20))
#
======album=====
Vytvoře třídy album pro reprezentaci alba. Třída bude mít sloty artist (interpret), title
(název alba), tracks (seznam skladeb), a year-of-release (rok vydání).
Napište
* metody pro čtení a nastavování hodnot slotů,
* dále metodu track-count pro zjištění počtu skladeb alba a
* metodu album-length, která vráti celkovou délku alba jako instanci třídy time-spec.
Také napište metody print-album, která vytiskne informaci o albu, viz příklady volání níže:
CL-USER 38 > (setf *album*
(make-album "Miles Davis"
"Bitches Brew"
(list (make-track
05))
(make-track
(make-track
(make-track
(make-track
time 14 01))
(make-track
(make-track
1969))
"Pharaoh's Dance" (make-time 20
"Bitches Brew" (make-time 26 58))
"Spanish Key" (make-time 17 32))
"John McLaughlin" (make-time 4 22))
"Miles Runs the Voodoo Down" (make"Sanctuary" (make-time 10 56))
"Feio" (make-time 11 49)))
#
CL-USER 39 > (track-count *album*)
7
CL-USER 40 > (tracks *album*)
(# # # #
# # #)
CL-USER 41 > (album-length *album*)
#
CL-USER 42 > (print-album *album*)
Album Bitches Brew by Miles Davis, released 1969.
1. Pharaoh's Dance
2. Bitches Brew
3. Spanish Key
4. John McLaughlin
5. Miles Runs the Voodoo Down
6. Sanctuary
7. Feio
Total length:105:43
20: 5
26:58
17:32
4:22
14: 1
10:56
11:49
Program nesmí hlásit žádné chyby ani upozornění (warning) při kompilaci. Výstup při
kompilaci by měl vypadat nějak takto:
;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0
;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3
;;; Source level debugging is on
;;; Source file recording is on
;;; Cross referencing is on
; (TOP-LEVEL-FORM 1)
; (DEFCLASS TIME-SPEC)
; (METHOD T-MIN (TIME-SPEC))
; (METHOD T-SEC (TIME-SPEC))
; MINUTE-P
; SECOND-P
; (METHOD SET-SEC (TIME-SPEC T))
; (METHOD SET-MIN (TIME-SPEC T))
; MS-TO-SEC
; (METHOD TIME-IN-SECONDS (TIME-SPEC))
; SEC-TO-MIN
; (METHOD SET-TIME-IN-SECONDS (TIME-SPEC T))
; MAKE-TIME
; (DEFCLASS TRACK)
; TRACK-P
; (METHOD NAME (TRACK))
; (METHOD LEN (TRACK))
; (METHOD SET-NAME (TRACK T))
; (METHOD SET-LEN (TRACK T))
; MAKE-TRACK
; (METHOD PRINT-TRACK (TRACK))
; MAKE-TRACKS
; (DEFCLASS ALBUM)
; (METHOD ARTIST (ALBUM))
; (METHOD TITLE (ALBUM))
; (METHOD TRACKS (ALBUM))
; (METHOD YEAR-OF-RELEASE (ALBUM))
; (METHOD SET-ARTIST (ALBUM T))
; (METHOD SET-TITLE (ALBUM T))
; (METHOD SET-TRACKS (ALBUM T))
; (METHOD PRINT-ALBUM (ALBUM))
; YEAR-OF-RELEASE-P
; (METHOD SET-YEAR-OF-RELEASE (ALBUM T))
; MAKE-ALBUM
; (METHOD TRACK-COUNT (ALBUM))
; (METHOD ALBUM-LENGTH (ALBUM))
---- Press space to continue ----