問題2.3

長方形のデータ構造。複数のやり方があるんだろうけど、とりあえず一番簡単な幅と高さを表す二つのベクタで定義。

; 線分の長さを求めるお助け関数
(define (length line)
  (let ((start (start-segment line))
	(end (end-segment line)))
	(let ((x1 (x-point start))
	    (x2 (x-point end))
	    (y1 (y-point start))
	    (y2 (y-point end)))
	  (sqrt (+ (square (- x2 x1)) (square (- y2 y1)))))))

; いつものsquare
(define (square x) (* x x))

; Constructor
(define (make-rectangle vec1 vec2)
  (cons vec1 vec2))

; Selector1
(define (get-base rect)
  (car rect))

; Selector2
(define (get-height rect)
  (cdr rect))

; Applicaition
; 周囲長
(define (perimeter rect)
  (let ((base (get-base rect))
	(height (get-height rect)))
	(let ((base-length (length base))
 	    (height-length (length height)))
	  (+ (* 2 base-length) (* 2 height-length)))))

; 面積
(define (area rect)
  (let ((base (get-base rect))
    (height (get-height rect)))
	(let ((base-length (length base))
	    (height-length (length height)))
	  (* base-length height-length))))

別の実装って、どうするんだろう? とりあえず、対角線のベクタで定義してやる方法かな。
ま、何とでもできそうな気がするので、飛ばそう。
確か、あとで直交座標形と極座標形で同じような話が出てきたはず。