SICPを読む(34) 問題2.1 ちとはまった。

問題 2.1

そういえば「再代入の方法を知らない」という事実に気がついた。

正負を逆にするだけで大変だ・・・。

う〜ん、う〜ん。

新しい変数を用意して代入する手もあるけど、なんかBASIC!って感じなので、パス。

考えた末に、

(define (make-rat n d)
  (define (rat-normal x)
    (if (negative? (denom x))
        (cons (* -1 (numer x))
              (* -1 (denom x)))
        x))
  (define (rat-gcd x)
    (let ((g (gcd (numer x) (denom x))))
      (cons (/ (numer x) g)
            (/ (denom x) g))))
  (rat-normal (rat-gcd (cons n d))))

3回consしてみた。イマイチかな・・・。

追記

2.1.2を見ると、この考え方も全然アリだと思い始めた。変更が凄く容易だし、新しい機能を追加するのも柔軟に対処出来る。

再代入やletの使用を避けたことで新しいものが見えた気がする。