SICP 2.2

抽象データ型とセレクタを作って、それらを利用する手続きを定義する練習。

; point
(define make-point cons)
(define x-point car)
(define y-point cdr)
(define (print-point p)
  (display "(")
  (display (x-point p))
  (display ",")
  (display (y-point p))
  (display ")")
  (newline))

; segment
(define make-segment cons)
(define start-segment car)
(define end-segment cdr)
(define (midpoint-segment p)
  (define (avarage x y) (/ (+ x y) 2))
  (let ((s (start-segment p))
        (e (end-segment p)))
    (make-point
     (avarage (x-point s) (x-point e))
     (avarage (y-point s) (y-point e)))))

; test
(define p1 (make-point 1 5))
(define p2 (make-point 3 11))
(define s1 (make-segment p1 p2))
(print-point (midpoint-segment s1))

リストじゃなくてconsがプリミティブっていうのはちょっと違和感がある。consセルが存在しなくって、リストだけっていうのもアリじゃないのかなぁ。