問題 2.1

解の例を発見。以下。

(define (make-rat n d)
  (let ((g ((if (< d 0) - +) (gcd n d))))
    (cons (/ n g) (/ d g))))

げ、こんな簡単に書けるの? と言いつつ盛り込んでみて試験してみたら以下。

make -k 
Testing rational ...                                             failed.
discrepancies found.  Errors are:
test 3/-3: expects (-1 . 1) => got (1 . -1)
test -3/-3: expects (-1 . 1) => got (-1 . -1)
test (+ 1/-2 1/3): expects (-1 . 6) => got (1 . -6)
test (+ 1/2 -1/3): expects (1 . 6) => got (-1 . -6)
test (- -1/2 1/3): expects (-5 . 6) => got (5 . -6)
test (- 1/2 -1/3): expects (5 . 6) => got (-5 . -6)
test (* 1/-2 1/3): expects (-1 . 6) => got (1 . -6)
test (* 1/2 1/-3): expects (-1 . 6) => got (1 . -6)
test (/ 1/-2 1/3): expects (-3 . 2) => got (3 . -2)
test (/ 1/2 -1/3): expects (-3 . 2) => got (3 . -2)

Compilation finished at Thu Jan  7 22:50:31

これはダウトなわしの実装に近いような気がする。で、試験してみようかな、って思ったらわしの解は gcd も略してて話にもならん。orz
とりあえず UT 万歳、ってコトで (何