Blame


1 665c255d 2023-08-04 jrmu (define (add-rat x y)
2 665c255d 2023-08-04 jrmu (make-rat (+ (* (numer x) (denom y))
3 665c255d 2023-08-04 jrmu (* (numer y) (denom x)))
4 665c255d 2023-08-04 jrmu (* (denom x) (denom y))))
5 665c255d 2023-08-04 jrmu (define (sub-rat x y)
6 665c255d 2023-08-04 jrmu (make-rat (- (* (numer x) (denom y))
7 665c255d 2023-08-04 jrmu (* (numer y) (denom x)))
8 665c255d 2023-08-04 jrmu (* (denom x) (denom y))))
9 665c255d 2023-08-04 jrmu (define (mul-rat x y)
10 665c255d 2023-08-04 jrmu (make-rat (* (numer x) (numer y))
11 665c255d 2023-08-04 jrmu (* (denom x) (denom y))))
12 665c255d 2023-08-04 jrmu (define (div-rat x y)
13 665c255d 2023-08-04 jrmu (make-rat (* (numer x) (denom y))
14 665c255d 2023-08-04 jrmu (* (denom x) (numer y))))
15 665c255d 2023-08-04 jrmu (define (equal-rat? x y)
16 665c255d 2023-08-04 jrmu (= (* (numer x) (denom y))
17 665c255d 2023-08-04 jrmu (* (numer y) (denom x))))
18 665c255d 2023-08-04 jrmu
19 665c255d 2023-08-04 jrmu (define (print-rat x)
20 665c255d 2023-08-04 jrmu (newline)
21 665c255d 2023-08-04 jrmu (display (numer x))
22 665c255d 2023-08-04 jrmu (display "/")
23 665c255d 2023-08-04 jrmu (display (denom x)))
24 665c255d 2023-08-04 jrmu
25 665c255d 2023-08-04 jrmu
26 665c255d 2023-08-04 jrmu (define (gcd a b)
27 665c255d 2023-08-04 jrmu (if (= b 0)
28 665c255d 2023-08-04 jrmu a
29 665c255d 2023-08-04 jrmu (gcd b (remainder a b))))
30 665c255d 2023-08-04 jrmu ;; (define (make-rat n d)
31 665c255d 2023-08-04 jrmu ;; (let ((g (gcd n d)))
32 665c255d 2023-08-04 jrmu ;; (cons (/ n g) (/ d g))))
33 665c255d 2023-08-04 jrmu (define (numer x) (car x))
34 665c255d 2023-08-04 jrmu (define (denom x) (cdr x))
35 665c255d 2023-08-04 jrmu
36 665c255d 2023-08-04 jrmu ;; (define one-half (make-rat 1 2))
37 665c255d 2023-08-04 jrmu ;; (define one-third (make-rat 1 3))
38 665c255d 2023-08-04 jrmu
39 665c255d 2023-08-04 jrmu ;; (print-rat one-half)
40 665c255d 2023-08-04 jrmu ;; (print-rat (make-rat 1 2))
41 665c255d 2023-08-04 jrmu ;; (print-rat (add-rat one-third one-third))
42 665c255d 2023-08-04 jrmu ;; (print-rat (make-rat 2 3))
43 665c255d 2023-08-04 jrmu ;; (print-rat (add-rat one-half one-third))
44 665c255d 2023-08-04 jrmu ;; (print-rat (make-rat 5 6))
45 665c255d 2023-08-04 jrmu ;; (print-rat (mul-rat one-half one-third))
46 665c255d 2023-08-04 jrmu ;; (print-rat (make-rat 1 6))
47 665c255d 2023-08-04 jrmu ;; (print-rat (add-rat one-third one-third))
48 665c255d 2023-08-04 jrmu ;; (print-rat (make-rat 2 3))
49 665c255d 2023-08-04 jrmu
50 665c255d 2023-08-04 jrmu ;; 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.
51 665c255d 2023-08-04 jrmu
52 665c255d 2023-08-04 jrmu (define (make-rat n d)
53 665c255d 2023-08-04 jrmu (if (= d 0)
54 665c255d 2023-08-04 jrmu (error "Division by zero")
55 665c255d 2023-08-04 jrmu (let ((g-mag (abs (gcd n d)))
56 665c255d 2023-08-04 jrmu (n-mag (abs n))
57 665c255d 2023-08-04 jrmu (d-mag (abs d)))
58 665c255d 2023-08-04 jrmu (if (< (* n d) 0)
59 665c255d 2023-08-04 jrmu (cons (- (/ n-mag g-mag)) (/ d-mag g-mag))
60 665c255d 2023-08-04 jrmu (cons (/ n-mag g-mag) (/ d-mag g-mag))))))
61 665c255d 2023-08-04 jrmu
62 665c255d 2023-08-04 jrmu ;; (define zz-0-0 (make-rat 0 0))
63 665c255d 2023-08-04 jrmu (define zp-0-3 (make-rat 0 3))
64 665c255d 2023-08-04 jrmu (define np-1-2 (make-rat -1 2))
65 665c255d 2023-08-04 jrmu (define np-1-4 (make-rat -1 4))
66 665c255d 2023-08-04 jrmu (define nn-3-4 (make-rat -3 -4))
67 665c255d 2023-08-04 jrmu (define pp-4-3 (make-rat 4 3))
68 665c255d 2023-08-04 jrmu (define pn-5-2 (make-rat 5 -2))
69 665c255d 2023-08-04 jrmu (define pn-10-2 (make-rat 10 -2))
70 665c255d 2023-08-04 jrmu (define nn-9-3 (make-rat -9 -3))
71 665c255d 2023-08-04 jrmu
72 665c255d 2023-08-04 jrmu ;; (print-rat zz-0-0)
73 665c255d 2023-08-04 jrmu ;; (error "Division by zero")
74 665c255d 2023-08-04 jrmu (print-rat zp-0-3)
75 665c255d 2023-08-04 jrmu (display "=0/1")
76 665c255d 2023-08-04 jrmu (print-rat np-1-2)
77 665c255d 2023-08-04 jrmu (display "=-1/2")
78 665c255d 2023-08-04 jrmu (print-rat np-1-4)
79 665c255d 2023-08-04 jrmu (display "=-1/4")
80 665c255d 2023-08-04 jrmu (print-rat nn-3-4)
81 665c255d 2023-08-04 jrmu (display "=3/4")
82 665c255d 2023-08-04 jrmu (print-rat pp-4-3)
83 665c255d 2023-08-04 jrmu (display "=4/3")
84 665c255d 2023-08-04 jrmu (print-rat pn-5-2)
85 665c255d 2023-08-04 jrmu (display "=-5/2")
86 665c255d 2023-08-04 jrmu (print-rat pn-10-2)
87 665c255d 2023-08-04 jrmu (display "=-5/1")
88 665c255d 2023-08-04 jrmu (print-rat nn-9-3)
89 665c255d 2023-08-04 jrmu (display "=3/1")
90 665c255d 2023-08-04 jrmu (print-rat (sub-rat nn-9-3 pp-4-3))
91 665c255d 2023-08-04 jrmu (display "=5/3")
92 665c255d 2023-08-04 jrmu (print-rat (mul-rat np-1-2 np-1-2))
93 665c255d 2023-08-04 jrmu (display "=1/4")
94 665c255d 2023-08-04 jrmu (print-rat (div-rat pn-5-2 pn-10-2))
95 665c255d 2023-08-04 jrmu (display "=1/2")
96 665c255d 2023-08-04 jrmu (print-rat (sub-rat np-1-4 zp-0-3))
97 665c255d 2023-08-04 jrmu (display "=-1/4")
98 665c255d 2023-08-04 jrmu ;; (print-rat (div-rat nn-3-4 zp-0-3))
99 665c255d 2023-08-04 jrmu ;; (error "Division by zero")
100 665c255d 2023-08-04 jrmu (print-rat (div-rat np-1-4 pn-5-2))
101 665c255d 2023-08-04 jrmu (display "=1/10")
102 665c255d 2023-08-04 jrmu