Chapter 2
2.1 Exercise 2.1
2.2 Exercise 2.2
2.3 Exercise 2.3
2.4 Exercise 2.4
2.5 Exercise 2.5
2.6 Exercise 2.6
2.7 Exercise 2.7
2.8 Exercise 2.8
2.9 Exercise 2.9
2.10 Exercise 2.10
2.11 Exercise 2.11
2.12 Exercise 2.12
2.13 Exercise 2.13
2.14 Exercise 2.14
2.15 Exercise 2.15
2.16 Exercise 2.16
2.17 Exercise 2.17
2.18 Exercise 2.18
2.19 Exercise 2.19
2.20 Exercise 2.20
2.21 Exercise 2.21
2.22 Exercise 2.22
2.23 Exercise 2.23
2.24 Exercise 2.24
2.25 Exercise 2.25
2.26 Exercise 2.26
2.27 Exercise 2.27
2.28 Exercise 2.28
2.29 Exercise 2.29
2.30 Exercise 2.30
2.31 Exercise 2.31
2.32 Exercise 2.32
2.33 Exercise 2.33
2.34 Exercise 2.34
2.35 Exercise 2.35
2.36 Exercise 2.36
2.37 Exercise 2.37
2.38 Exercise 2.38
2.39 Exercise 2.39
2.40 Exercise 2.40
2.41 Exercise 2.41
2.42 Exercise 2.42
2.43 Exercise 2.43
2.44 Exercise 2.44
2.45 Exercise 2.45
2.46 Exercise 2.46
2.47 Exercise 2.47
2.48 Exercise 2.48
2.49 Exercise 2.49
2.50 Exercise 2.50
2.51 Exercise 2.51
2.52 Exercise 2.52
2.53 Exercise 2.53
2.54 Exercise 2.54
2.55 Exercise 2.55
2.56 Exercise 2.56
2.57 Exercise 2.57
2.58 Exercise 2.58
2.59 Exercise 2.59
2.60 Exercise 2.60
2.61 Exercise 2.61
2.62 Exercise 2.62
2.63 Exercise 2.63
2.64 Exercise 2.64
2.65 Exercise 2.65
2.66 Exercise 2.66
2.67 Exercise 2.67
2.68 Exercise 2.68
2.69 Exercise 2.69
2.70 Exercise 2.70
2.71 Exercise 2.71
2.72 Exercise 2.72
2.73 Exercise 2.73
2.74 Exercise 2.74
2.75 Exercise 2.75
2.76 Exercise 2.76
2.77 Exercise 2.77
2.78 Exercise 2.78
2.79 Exercise 2.79
2.80 Exercise 2.80
2.81 Exercise 2.81
2.82 Exercise 2.82
2.83 Exercise 2.83
2.84 Exercise 2.84
2.85 Exercise 2.85
2.86 Exercise 2.86
2.87 Exercise 2.87
2.88 Exercise 2.88
2.89 Exercise 2.89
2.90 Exercise 2.90
2.91 Exercise 2.91
2.92 Exercise 2.92
2.93 Exercise 2.93
2.94 Exercise 2.94
2.95 Exercise 2.95
2.96 Exercise 2.96
2.97 Exercise 2.97

2.3 Exercise 2.3

Two representations of rectangles come to mind immediately:

To make sure that we produce rectangles, the connections to the origin will need to be tested in both of the construction procedures.

First, the procedures for making rectangles out of width and height line segments:

(define (make-rectangle-segments width height)
  (define (is-origin point)
    (= 0 (x-point point) (y-point point)))
  (let ((origin-width (start-segment width))
        (origin-height (start-segment height)))
    (cond ((not (is-origin origin-width))
           (error "width segment must be from origin"))
          ((not (is-origin origin-height))
           (error "height segment must be from origin"))
          ((not (= 0 (y-point (end-segment width))))
           (error "width segment must have no y component"))
          ((not (= 0 (x-point (end-segment height))))
           (error "height segment must have no x component"))
          (else (cons width height)))))

This procedure is, after error-checking to make sure both the width and height segments begin from the origin and that they are both parallel to their respective axes, just a cons call like the others.

The segment selectors are just as simple as the others. But in order to calculate the area and perimeter of the rectangle, we need to get the width and height of the rectangle as numbers. By extracting the coordinates from the ends of the width and height segments, we can do this:

(define (get-width-segment rect) (car rect))
(define (get-width rect)
  (x-point (end-segment (get-width-segment rect))))
(define (get-height-segment rect) (cdr rect))
(define (get-height rect)
  (y-point (end-segment (get-height-segment rect))))

Then we can calculate the area and perimeter using these get-width and get-height procedures:

(define (area rect)
  (* (get-width rect) (get-height rect)))
(define (perimeter rect)
  (* 2 (+ (get-width rect) (get-height rect))))

Now let’s move on to our second representation, using a bottom ("width") corner and a top ("height") corner – or perhaps it’s better to describe this as being made of the end-segment points from the width and height segments used in the last representation. Since it takes less complex data in its construction, the new procedure make-rectangle-points is simpler in providing the same guarantees as make-rectangle-segments, because it has no origins points in line segments to check.

(define (make-rectangle-points width-corner height-corner)
  (cond ((not (= 0 (y-point width-corner)))
         (error ("width corner must have no y component")))
        ((not (= 0 (x-point height-corner)))
         (error ("height corner must have no x component")))
        (else (cons width-corner height-corner))))

Getting the width and height of the rectangle is also easier, since there are fewer data structures to traverse:

(define (get-width-corner rect)
  (car rect))
(define (get-width rect)
  (x-point (get-width-corner rect)))
(define (get-height-corner rect)
  (cdr rect))
(define (get-height rect)
  (y-point (get-height-corner rect)))

And with that, we can use area and perimeter just as before.

In a real implementation, it would be better to hide references to the implementation-specific details, like -segment and -corner, behind standard interfaces like make-rectangle, get-width, and get-height. More on this topic will be introduced later in the book.