======Ú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)) # CL-USER 32 > (inspect *) # is a TRACK NAME "Pharaoh Dance" LEN # CL-USER 20 > (setf *track* (make-track "Pharaoh Dance" (make-time 3 20))) # CL-USER 21 > (name *track*) "Pharaoh Dance" CL-USER 22 > (len *track*) # CL-USER 25 > (t-min (len *track*)) 3 CL-USER 26 > (t-sec (len *track*)) 20 CL-USER 27 > (print-track *track*) Pharaoh Dance # 3:20 CL-USER 29 > (set-name *track* "New Name") # CL-USER 30 > (name *track*) "New Name" ======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 ----