1.8  Example: Design recipe for functions (using union arguments)

;; Contract and Purpose
;; Shape -> Number
;; compute the distance of a shape s from the origin
;; (define (distTo0 s) ...

;; Examples:
;; (= (distTo0 cir1) 30)
;; (= (distTo0 cir2) 50)
;; (= (distTo0 rect1) 30)
;; (= (distTo0 rect2) 50)
;; (= (distTo0 dot1) 30)
;; (= (distTo0 dot2) 80)

;; Template:
;; ... (cond
;;       [(circle? s) ...]
;;       [(rect? s)   ...]
;;       [(dot? s)    ...]

;; But, looking at the structures for each kind of shape we get:
;; ... (cond
;;       [(circle? s) ...(circle-center s) ... (circle-radius s) ...]
;;       [(rect? s)   ...(rect-nw s) ... (rect-width s) ... (rect-height s) ...]
;;       [(dot? s)    ...(posn-x s) ... (posn-y s) ...]
                               
;; Program:
(define (distTo0 s) 
  (cond
   [(circle? s) (dist (circle-center s) (make-posn 0 0))]
   [(rect? s)   (dist (rect-nw s) (make-posn 0 0))]
   [(posn? s)    (dist s (make-posn 0 0))] ))


;; Tests:
(= (distTo0 cir1) 30)
(= (distTo0 cir2) 50)
(= (distTo0 rect1) 30)
(= (distTo0 rect2) 50)
(= (distTo0 dot1) 30)
(= (distTo0 dot2) 50)

1.9  Example: Design recipe for functions (using self-referential arguments)

Example: counting the number of items in a list

;; A List-of-Auto is either
;;   - the empty list, or
;;   - (cons a loa) where a is an Auto and loa is a List-of-Auto

;; count the number of autos in the loa list
;; List-of-Auto -> Number
;; (define (count loa) ...

;; Examples:
;; (= (count mt-loa) 0)
;; (= (count loa1) 1)
;; (= (count loa2) 2)
;; (= (count loa3) 3)

;; Template:
;; (cond
;;   [(empty? loa) ...]
;;   [else ... (first loa) ...
;;         ... (count (rest loa)) ...]

;; Program:
(define (count loa)
  (cond
   [(empty? loa) 0]
   [else (+ 1 (count (rest loa)))]))

;; Tests:
(= (count mt-loa) 0)
(= (count loa1) 1)
(= (count loa2) 2)
(= (count loa3) 3)