Blob


1 (define (add-rat x y)
2 (make-rat (+ (* (numer x) (denom y))
3 (* (numer y) (denom x)))
4 (* (denom x) (denom y))))
5 (define (sub-rat x y)
6 (make-rat (- (* (numer x) (denom y))
7 (* (numer y) (denom x)))
8 (* (denom x) (denom y))))
9 (define (mul-rat x y)
10 (make-rat (* (numer x) (numer y))
11 (* (denom x) (denom y))))
12 (define (div-rat x y)
13 (make-rat (* (numer x) (denom y))
14 (* (denom x) (numer y))))
15 (define (equal-rat? x y)
16 (= (* (numer x) (denom y))
17 (* (numer y) (denom x))))
19 (define (print-rat x)
20 (newline)
21 (display (numer x))
22 (display "/")
23 (display (denom x)))
26 (define (gcd a b)
27 (if (= b 0)
28 a
29 (gcd b (remainder a b))))
30 ;; (define (make-rat n d)
31 ;; (let ((g (gcd n d)))
32 ;; (cons (/ n g) (/ d g))))
33 (define (numer x) (car x))
34 (define (denom x) (cdr x))
36 ;; (define one-half (make-rat 1 2))
37 ;; (define one-third (make-rat 1 3))
39 ;; (print-rat one-half)
40 ;; (print-rat (make-rat 1 2))
41 ;; (print-rat (add-rat one-third one-third))
42 ;; (print-rat (make-rat 2 3))
43 ;; (print-rat (add-rat one-half one-third))
44 ;; (print-rat (make-rat 5 6))
45 ;; (print-rat (mul-rat one-half one-third))
46 ;; (print-rat (make-rat 1 6))
47 ;; (print-rat (add-rat one-third one-third))
48 ;; (print-rat (make-rat 2 3))
50 ;; Exercise 2.1. Define a better version of make-rat that handles both positive and negative arguments. Make-rat should normalize the sign so that if the rational number is positive, both the numerator and denominator are positive, and if the rational number is negative, only the numerator is negative.
52 (define (make-rat n d)
53 (if (= d 0)
54 (error "Division by zero")
55 (let ((g-mag (abs (gcd n d)))
56 (n-mag (abs n))
57 (d-mag (abs d)))
58 (if (< (* n d) 0)
59 (cons (- (/ n-mag g-mag)) (/ d-mag g-mag))
60 (cons (/ n-mag g-mag) (/ d-mag g-mag))))))
62 ;; (define zz-0-0 (make-rat 0 0))
63 (define zp-0-3 (make-rat 0 3))
64 (define np-1-2 (make-rat -1 2))
65 (define np-1-4 (make-rat -1 4))
66 (define nn-3-4 (make-rat -3 -4))
67 (define pp-4-3 (make-rat 4 3))
68 (define pn-5-2 (make-rat 5 -2))
69 (define pn-10-2 (make-rat 10 -2))
70 (define nn-9-3 (make-rat -9 -3))
72 ;; (print-rat zz-0-0)
73 ;; (error "Division by zero")
74 (print-rat zp-0-3)
75 (display "=0/1")
76 (print-rat np-1-2)
77 (display "=-1/2")
78 (print-rat np-1-4)
79 (display "=-1/4")
80 (print-rat nn-3-4)
81 (display "=3/4")
82 (print-rat pp-4-3)
83 (display "=4/3")
84 (print-rat pn-5-2)
85 (display "=-5/2")
86 (print-rat pn-10-2)
87 (display "=-5/1")
88 (print-rat nn-9-3)
89 (display "=3/1")
90 (print-rat (sub-rat nn-9-3 pp-4-3))
91 (display "=5/3")
92 (print-rat (mul-rat np-1-2 np-1-2))
93 (display "=1/4")
94 (print-rat (div-rat pn-5-2 pn-10-2))
95 (display "=1/2")
96 (print-rat (sub-rat np-1-4 zp-0-3))
97 (display "=-1/4")
98 ;; (print-rat (div-rat nn-3-4 zp-0-3))
99 ;; (error "Division by zero")
100 (print-rat (div-rat np-1-4 pn-5-2))
101 (display "=1/10")