計算機プログラムの構造と解釈 第二版 P49 問題2.1

とうとう二章突入ですね。


この問題は分数の符号を扱う問題。
題意としては

・make-ratという手続きをつくる。

make-ratは分母がマイナスの時、分母をマイナスのままにしないで、
分子をマイナスにしてやると言う感じ。


まーそんな感じでわりかし単純な問題です。


以下に実装

#!/usr/local/bin/gosh
;; -*- coding: utf-8 -*-

(use ggc.debug.trace)
(use math.mt-random)


(define (add-rat x y)
  (make-rat (+ (* (numer x) (denom y)) 
               (* (numer y) (denom x)))
            (* (denom x) (denom y))))

(define (sub-rat x y)
  (make-rat (- (* (number x) (denom y)) 
               (* (number y) (denom x)))
            (* (denom x) (denom y))))

(define (mul-rat x y)
  (make-rat (* (numer x) (numer y)) 
            (* (denom x) (denom y))))

(define (div-rat x y)
  (make-rat (* (numer x) (denom y)) 
            (* (denom x) (numer y))))

(define (equal-rat? x y)
  (= (* (numer x) (denom y)) 
     (* (numer y) (denom x))))


;;ここがこの問題の求める部分
(define (make-rat n d)
  (let ((g (gcd n d)))
    (if (< d 0)
      (cons (/ (- n) g) (/ (- d) g)) 
      (cons (/ n g) (/ d g)))))



(define (numer x) (car x)) 

(define (denom x) (cdr x)) 

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


;;解答を確認するための定義
(define one-half (make-rat 1 -2))
(define one-third (make-rat -1 3))
(define one-forth (make-rat -1 -4))
(define one-fifth (make-rat 1 5))

;; main
(define (main args)

  (display "(print-rat one-half) : ")
  (print-rat one-half)
  (newline)

  (display "(print-rat one-third) : ")
  (print-rat one-third)
  (newline)

  (display "(print-rat one-forth) : ")
  (print-rat one-forth)
  (newline)

  (display "(print-rat one-fifth) : ")
  (print-rat one-fifth)
  (newline)

0)


実行!

(print-rat one-half) : -1/2
(print-rat one-third) : -1/3
(print-rat one-forth) : 1/4
(print-rat one-fifth) : 1/5


cool!!
自画自賛