Implementing Pairs

(define (make-pair a b)
  ; Traditionally called CONS (for "construct")
  (lambda (which?)
    (if (= which? 1)
        a
        b)))

(define (left pair)
  ; Traditionally called CAR
  (pair 1))

(define (right pair)
  ; Traditionally called CDR
  (pair 2))

Implementation of Points

(define (first-dimension point) (car point))
(define (other-dimensions point) (cdr point))
(define (zero-dimension? point) (null? point))

(define origin-3d (list 0 0 0))
(define p1 (list 2 3))
(define p2 (list 3 4))
(define p3 (list 2 7))

(distance p1 p2)
(distance p1 p3)
(distance p3 p1)

Lines as Pairs of Points

(define (make-line p1 p2)
  (cons p1 p2))
(define (line-start l) (car l))
(define (line-end l) (cdr l))

(define (line-length line)
  (distance (line-start line) (line-end line)))

Figures as Lists of Lines

(define (figure-length figure)
  (if (no-more-lines? figure)
      0
      (+ (line-length (first-line figure))
	 (figure-length (rest-of-lines figure)))))

(define (no-more-lines? f) (null? f))
(define (first-line f) (car f))
(define (rest-of-lines f) (cdr f))

Testing Figures

(define (points->open-figure points)
  (if (or (null? points) (null? (cdr points)))
      '()
      (cons (make-line (car points) (car (cdr points)))
	    (points->open-figure (cdr points)))))

(define unit-square
  (points->open-figure
   (list ((list 0 0) (list 0 1)
	  (list 1 1) (list 1 0) (list 0 0)))))

(define unit-right-triangle
  (list (list 0 0) (list 0 1) (list 1 0) (list 0 0)))

(figure-length unit-square)
(figure-length unit-right-triangle)