SICP 2.1

やっと2章に突入。

抽象データ型のコンストラクタを改良する問題。
ここで出てくるコンストラクタ・セレクタHaskellのデータコンストラクタ・セレクタと同じ。

と思ったけど、2.1.3の注釈に抽象モデルと代数的仕様というのが書いてある。Haskellのは確か、代数的データ型とか言ったから、後者のモデルに基づいているのだろうか。よくわからないが、何か違いがあるのかもしれない。

(define (make-rat numer denom)
  (let* ((g (gcd numer denom))
         (n (/ numer g))
         (d (/ denom g)))
    (if (> d 0)
        (cons n d)
        (cons (- n) (- d)))))

(define numer car)
(define denom cdr)

(define (print-rat x)
  (display (numer x))
  (display "/")
  (display (denom x))
  (newline))

(print-rat (make-rat 10 5))
(print-rat (make-rat 10 -5))
(print-rat (make-rat -10 5))
(print-rat (make-rat -10 -5))