; A pipe is ; (make-pipe num sym) (define-struct pipe (len kind)) ;(define (func-for-pipe p) ; ... (pipe-len p) ... (pipe-kind p) ...) ; A pipeline is either ; - empty ; - (cons pipe pipeline) ;(define (func-for-pipeline pl) ; (cond ; [(empty? pl) ...] ; [(cons? pl) ; ... (func-for-pipe (first pl)) ; ... (func-for-pipeline (rest pl))])) ; total-length : pipeline -> num (define (total-length pl) (cond [(empty? pl) 0] [(cons? pl) (+ (pipe-len (first pl)) (total-length (rest pl)))])) (total-length empty) "should be" 0 (total-length (cons (make-pipe 10 'copper) (cons (make-pipe 20 'lead) empty))) "should be" 30 ; modernize : pipeline -> pipeline (define (modernize pl) (cond [(empty? pl) empty] [(cons? pl) (cons (modern-pipe (first pl)) (modernize (rest pl)))])) ; modern-pipe : pipe -> pipe (define (modern-pipe p) (cond [(symbol=? (pipe-kind p) 'lead) (make-pipe (pipe-len p) 'copper)] [else p])) (modern-pipe (make-pipe 10 'plastic)) "should be" (make-pipe 10 'plastic) (modern-pipe (make-pipe 20 'lead)) "should be" (make-pipe 20 'copper) (modernize empty) "should be" empty (modernize (cons (make-pipe 10 'copper) (cons (make-pipe 20 'lead) empty))) "should be" (cons (make-pipe 10 'copper) (cons (make-pipe 20 'copper) empty))