Example: Design recipe for self-referential data
We are using the earlier definitions of Circle and Rectangle, and we leave it to the reader to design the helper functions (c-within c p) and (r-within r p) that determine whether the Posn p is within the Circle c or Rectangle r respectively.
;; A Combo is a structure of Shapes Shapes
(define-struct combo (top bottom))
;; A Shapes is either
;; - a Circle
;; - a Rectangle
;; - a Combo
;; Examples of Shapes
;; remember earlier definitions of cir1, cir2, rect1,and rect2
(define combo1 (make-combo cir1 cir2))
(define combo2 (make-combo rect1 combo1))
(define combo3 (make-combo combo2 rect2))
;; determine whether p is within the shapes cs
;; Shapes -> Boolean
;; (define (within? cs p) ...
;; Examples (to be used as tests after the program is written)
;; (equal? (within? combo1 (make-posn 30 10)) true)
;; (equal? (within? combo1 (make-posn 30 50)) false)
;; (equal? (within? combo3 (make-posn 50 25)) true)
;; (equal? (within? combo2 (make-posn 50 25)) false)
;; Template:
;; (cond
;; [(circle? cs) ...]
;; [(rect? cs) ...]
;; [else ... (within? (combo-top cs) p) ...
;; ... (within? (combo-bottom cs) ...]
;; Program:
(define (within? cs p)
(cond
[(circle? cs) (c-within? cs p)]
[(rect? cs) (r-within? cs p)]
[else (or (within? (combo-top cs) p)
(within? (combo-bottom cs) p))]))