19Jul/090
Exercise 2.3 of SICP
Exercise 2.3: Implement a representation for rectangles in a plane. (Hint: You may want to make use of exercise 2.2.) In terms of your constructors and selectors, create procedures that compute the perimeter and the area of a given rectangle. Now implement a different representation for rectangles. Can you design your system with suitable abstraction barriers, so that the same perimeter and area procedures will work using either representation?
I have decided to use a diagonal segment for representation of make-rectangle and a point with both dimensional magnitudes for make-rectangle2.
(define (make-segment p1 p2) (cons p1 p2)) (define (start-segment s) (car s)) (define (end-segment s) (cdr s)) (define (average a b) (/ (+ a b) 2.0)) (define (make-point x y) (cons x y)) (define (x-point p) (car p)) (define (y-point p) (cdr p)) (define (midpoint-segment s) (make-point (average (x-point (start-segment s)) (x-point (end-segment s))) (average (y-point (start-segment s)) (y-point (end-segment s))))) (define (dimension direction r) (- (direction (end-segment r)) (direction (start-segment r)))) (define (width r) (dimension y-point r)) (define (length r) (dimension x-point r)) (define (make-rectangle s) s) (define (make-rectangle2 p length width) (make-segment p (make-point (+ (x-point p) length) (+ (y-point p) width)))) (define (area r) (* (length r) (width r))) (define (perimeter r) (* 2 (+ (length r) (width r))))
(define R
(make-rectangle (make-segment
(make-point 0 0)
(make-point 4 4))))
> (area R) 16 > (perimeter R) 16
(define R2 (make-rectangle2
(make-point 0 0)
4 4))
> (area R2) 16 > (perimeter R2) 16
(define R
(make-rectangle (make-segment
(make-point 2 1)
(make-point 5 4))))
> (area R) 9 > (perimeter R) 12
(define R2 (make-rectangle2
(make-point 2 1)
3 3))
> (area R) 9 > (perimeter R) 12