(define-struct account (name num balance)) ;; An Account is a (make-account String Number Number) ;; make-account : String Number Number -> Account ;; account? : Any -> Boolean ;; account-name : Account -> String ;; account-num : Account -> Number ;; account-balance : Account -> Number (define acct-pnk (make-account "Felix Klock" 101 20000.00)) (define acct-nin (make-account "Trent Reznor" 102 100000000.00)) (define acct-gobias (make-account "Tobias Fumke" 103 10.00)) ;; meets-balance-requirement? : Account Number -> Boolean ;; Does acct meet the balance requirement req ? (define (meets-balance-requirement? acct req) (>= (account-balance acct) req)) (equal? (meets-balance-requirement? (make-account (string-append "Mr." "T") 10 (+ 10.00 15.00)) 20.00) true) (equal? (meets-balance-requirement? acct-gobias 50.00) false) (equal? (meets-balance-requirement? acct-pnk 50.00) true) (equal? (meets-balance-requirement? acct-nin 1000000) true) (equal? (meets-balance-requirement? acct-pnk 1000000) false) ;; bigger-balance? : Account Account -> Boolean ;; Does acct-1 have a bigger balance than acct-2 ? (define (bigger-balance? acct-1 acct-2) (> (account-balance acct-1) (account-balance acct-2))) (equal? (bigger-balance? acct-gobias acct-pnk) false) (equal? (bigger-balance? acct-nin acct-pnk) true) (equal? (bigger-balance? acct-pnk acct-pnk) false) ;; bear-interest : Account -> Account ;; Produces a new account that has earned 1% interest (define (bear-interest acct) (make-account (account-name acct) (account-num acct) (* 1.01 (account-balance acct)))) (equal? (bear-interest acct-gobias) (make-account "Tobias Fumke" 103 10.10)) (equal? (bear-interest acct-pnk) (make-account "Felix Klock" 101 20200.00)) (equal? (bear-interest acct-nin) (make-account "Trent Reznor" 102 101000000.00)) ;;;;;;;;;;;;;;;;;;;;;;;;;; (define-struct artist (first last)) ;; An Artist is a (make-artist String String) (define-struct cd (title artist num-discs)) (define-struct tape (title artist)) ;; A Recording is either a ;; - (make-cd String Artist Number) ;; - (make-tape String Artist) (define venus-and-back (make-cd "To Venus and Back Again" (make-artist "Tori" "Amos") 2)) (define the-fragile (make-cd "The Fragile" (make-artist "Trent" "Reznor") 2)) (define harvest (make-tape "Harvest" (make-artist "Neil" "Young"))) (define pallelujah (make-cd "Paullelujah" (make-artist "Paul" "Barman") 1)) ;; TEMPLATE FOR PROCESSING RECORDINGS: #| ;; func : Recording -> ??? ;; ?????? (define (func rec) (cond [(cd? rec) ... (cd-title rec) ... ... (cd-artist rec) ... ... (cd-num-discs rec) ...] [(tape? rec) ... (tape-title rec) ... ... (tape-artist rec) ...])) |# ;; recording-price : Recording -> Number ;; Returns price for rec (define (recording-price rec) (cond [(cd? rec) (* 11 (cd-num-discs rec))] [(tape? rec) 9])) (equal? (recording-price harvest) 9) (equal? (recording-price the-fragile) 22) (equal? (recording-price venus-and-back) 22) (equal? (recording-price pallelujah) 11) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define-struct empty-inventory ()) (define-struct bigger-inventory (album rest)) ;; An Inventory is either: ;; - (make-empty-inventory), or ;; - (make-bigger-inventory Recording Inventory) ;; Nothing else is an Inventory. ;;; Examples of Inventorys. (define in1 (make-empty-inventory)) (define in2 (make-bigger-inventory harvest (make-empty-inventory))) (define in3 (make-bigger-inventory pallelujah (make-empty-inventory))) (define in4 (make-bigger-inventory venus-and-back (make-bigger-inventory the-fragile (make-empty-inventory))))