;; The first three lines of this file were inserted by DrScheme. They record metadata ;; about the language level of this file in a form that our tools can easily process. #reader(lib "htdp-advanced-reader.ss" "lang")((modname |40.1|) (read-case-sensitive #t) (teachpacks ((lib "guess-gui.ss" "teachpack" "htdp") (lib "guess.ss" "teachpack" "htdp") (lib "gui.ss" "teachpack" "htdp") (lib "draw.ss" "teachpack" "htdp"))) (htdp-settings #(#t constructor repeating-decimal #t #t none #f ((lib "guess-gui.ss" "teachpack" "htdp") (lib "guess.ss" "teachpack" "htdp") (lib "gui.ss" "teachpack" "htdp") (lib "draw.ss" "teachpack" "htdp"))))) #| Exercise 40.1.3. Show how to implement the following structure definitions as functions: 1. (define-struct movie (title producer)) 2. (define-struct boyfriend (name hair eyes phone)) 3. (define-struct cheerleader (name number)) 4. (define-struct CD (artist title price)) 5. (define-struct sweater (material size producer)) Pick one and demonstrate that the expected laws hold. Solution |# (define (make-movie title producer) (local ((define title0 title) (define producer0 producer) (define (service-manager msg) (cond [(equal? msg 'title) title0] [(equal? msg 'producer) producer0]))) service-manager)) (define (movie-title amovie) (amovie 'title)) (define (movie-producer amovie) (amovie 'producer)) (define SciFi (make-movie 'StarWars 'GeorgeLucas)) (movie-title SciFi) (movie-producer SciFi) (define (make-boyfriend name hair eyes phone) (lambda (selector) (selector name hair eyes phone))) (define (boyfriend-name aboyfriend) (aboyfriend (lambda (name hair eyes phone) name))) (define (boyfriend-hair aboyfriend) (aboyfriend (lambda (name hair eyes phone) hair))) (define (boyfriend-eyes aboyfriend) (aboyfriend (lambda (name hair eyes phone) eyes))) (define (boyfriend-phone aboyfriend) (aboyfriend (lambda (name hair eyes phone) phone))) (define Aaron (make-boyfriend 'Aaron 'black 'black 715)) (boyfriend-name Aaron) (boyfriend-hair Aaron) (boyfriend-eyes Aaron) (boyfriend-phone Aaron) (define (make-cheerleader name number) (lambda (selector) (selector name number))) (define (cheerleader-name acheerleader) (acheerleader (lambda (name number) name))) (define (cheerleader-number acheerleader) (acheerleader (lambda (name number) number))) (define Abbo (make-cheerleader 'Abbo 53535)) (cheerleader-name Abbo) (cheerleader-number Abbo) (define (make-CD artist title price) (local ((define artist0 artist) (define title0 title) (define price0 price) (define (service-manager msg) (cond [(equal? msg 'artist) artist0] [(equal? msg 'title) title0] [(equal? msg 'price) price0]))) service-manager)) (define (CD-artist aCD) (aCD 'artist)) (define (CD-title aCD) (aCD 'title)) (define (CD-price aCD) (aCD 'price)) (define BeeGees (make-CD 'BeeGees 'SaturdayNightFever 9.99)) (CD-artist BeeGees) (CD-title BeeGees) (CD-price BeeGees) (define (make-sweater material size producer) (lambda (selector) (selector material size producer))) (define (sweater-material asweater) (asweater (lambda (material size producer) material))) (define (sweater-size asweater) (asweater (lambda (material size producer) size))) (define (sweater-producer asweater) (asweater (lambda (material size producer) producer))) (define YellowJacket (make-sweater 'Cotton 'Large 'Unknown)) (sweater-material YellowJacket) (sweater-size YellowJacket) (sweater-producer YellowJacket)