; A snake is ; (make-snake sym num sym) (define-struct snake (name weight food)) ;; Example snake: (make-snake 'slinky 12 'rats) ;; Example uses of the selectors (snake-name (make-snake 'slinky 12 'rats)) (snake-weight (make-snake 'slinky 12 'rats)) (snake-food (make-snake 'slinky 12 'rats)) ;; Example abbreviation (but avoiding abbreviations ;; until you feel like you really understand what's ;; going on) (define Slinky (make-snake 'slinky 12 'rats)) ;; ---------------------------------------- ;; Implement snake-skinny? ;; Data step is done above ;; snake-skinny? : snake -> bool ;; Returns true if s is less than 10 lbs, false ;; otherwise ;(define (snake-skinny? s) ; ... (snake-name s) ; (snake-weight s) ; (snake-food s) ...) (define (snake-skinny? s) (< (snake-weight s) 10)) (snake-skinny? (make-snake 'slinky 12 'rats)) "should be" false (snake-skinny? (make-snake 'slimey 5 'grass)) "should be" true (snake-skinny? (make-snake 'suzie 10 'people)) "should be" false ;; ---------------------------------------- ;; Implement feed-snake ;; Data step is done above ; feed-snake : snake -> snake ; To feed s five pounds ;(define (feed-snake s) ; ... (snake-name s) ; (snake-weight s) ; (snake-food s) ...) (define (feed-snake s) (make-snake (snake-name s) (+ 5 (snake-weight s)) (snake-food s))) (feed-snake (make-snake 'slinky 12 'rats)) "should be" (make-snake 'slinky 17 'rats) ;; ---------------------------------------- ;; Implement run-over-with-car ; A dillo is ; (make-dillo num bool) (define-struct dillo (weight alive?)) ;; Example: (make-dillo 3 true) (make-dillo 2 false) ; run-over-with-car : dillo -> dillo ; To kill dillo d (accidentally) ;(define (run-over-with-car d) ; ... (dillo-weight d) ; (dillo-alive? d) ...) (define (run-over-with-car d) (make-dillo (dillo-weight d) false)) (run-over-with-car (make-dillo 3 true)) "should be" (make-dillo 3 false) (run-over-with-car (make-dillo 2 false)) "should be" (make-dillo 2 false) ;; ---------------------------------------- ;; Implement feed-dillo ;; This one is almost like feed-snake, ;; except for the twist about dead dillos. ;; It makes sense, then, to implement a ;; simple dillo feeder, force-feed-dillo, ;; and then handle the extra twist in a ;; separate function (i.e., break up the ;; problem into smaller pieces even before ;; applying the recipe) ; force-feed-dillo : dillo -> dillo ; Feeds d 2 lbs of food ;(define (force-feed-dillo d) ; ... (dillo-weight d) ; (dillo-alive? d) ...) (define (force-feed-dillo d) (make-dillo (+ 2 (dillo-weight d)) (dillo-alive? d))) (force-feed-dillo (make-dillo 2 true)) "should be" (make-dillo 4 true) (force-feed-dillo (make-dillo 1 false)) "should be" (make-dillo 3 false) ; feed-dillo : dillo -> dillo ;; feed d 2 lbs if d is alive ;(define (feed-dillo d) ; ... (dillo-weight d) ; (dillo-alive? d) ...) (define (feed-dillo d) (cond [(dillo-alive? d) (force-feed-dillo d)] [else d])) (feed-dillo (make-dillo 2 true)) "should be" (make-dillo 4 true) (feed-dillo (make-dillo 1 false)) "should be" (make-dillo 1 false)