Taras Bunyk

SICP 2.1.2 Abstraction barriers

Published: 2020-07-08T21:44:14.000Z

In this section I'm starting to have strong need for types.

Code in exercises becomes more verbose.

Exercise 2.2

(define make-segment cons)
(define start-segment car)
(define end-segment cdr)

(define make-point cons)
(define x-point car)
(define y-point cdr)

(define (mid-segment segment)
  (let (
    (s (start-segment segment))
    (e (end-segment segment))
  )

  (make-point
    (/ (+ (x-point s) (x-point e)) 2)
    (/ (+ (y-point s) (y-point e)) 2)
  ))
)

(define (print-point p)
  (newline)
  (display "(")
  (display (x-point p))
  (display ",")
  (display (y-point p))
  (display ")"))

(define a (make-point 1.0 2.0))
(define b (make-point 3.0 4.0))
(define ab (make-segment a b))

(print-point (mid-segment ab))

Exercise 2.3

(define make-rect cons)

(define (area rect) 
  (* (width-rect rect) (height-rect rect))
)

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

(define (sqr x) (* x x))
;; Some useful stuff for testing

;  d  c
;
;  a  b
(define a (make-point 0.0 0.0))
(define b (make-point 1.0 0.0))
(define c (make-point 1.0 1.0))
(define d (make-point 0.0 1.0))

(define ab (make-segment a b))
(define ad (make-segment a d))

;;; representation 1 - adjacent sides
(define rect (make-rect ab ad))

(define (distance point-a point-b)
  (sqrt (+
      (sqr (- (x-point point-a) (x-point point-b)))
      (sqr (- (y-point point-a) (y-point point-b)))
  ))
)
(define (length segment)
  (distance (start-segment segment) (end-segment segment))
)
(define (width-rect rect)
  (length (car rect))
)
(define (height-rect rect)
  (length (cdr rect))
)

;;; representation 2 - opposite points 

(define rect (make-rect a c))

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