diff --git a/ex-2_01-xx.scm b/ex-2_01-xx.scm new file mode 100644 index 0000000..db4f93a --- /dev/null +++ b/ex-2_01-xx.scm @@ -0,0 +1,55 @@ +(load "util.scm") + +(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 (- (* (numer x) (denom y)) + (* (numer 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))) + (cons (/ n g) (/ d g)))) +(define (numer x) (car x)) +(define (denom x) (cdr x)) + +(define (print-rat x) + (newline) + (display (numer x)) + (display "/") + (display (denom x))) + +; Examples +; (define one-half (make-rat 1 2)) +; (print-rat one-half) +; (define one-third (make-rat 1 3)) +; (print-rat (add-rat one-half one-third)) +; (print-rat (mul-rat one-half one-third)) +; (print-rat (add-rat one-third one-third)) + +(display "ex-2.1") + +(define (make-rat n d) + (let ((g (gcd n d))) + (if (< (* n d) 0) + (cons (- (abs (/ n g))) (abs (/ d g))) + (cons (abs (/ n g)) (abs (/ d g)))))) + +(print-rat (make-rat 3 9)) +(print-rat (make-rat -3 9)) +(print-rat (make-rat 3 -9)) +(print-rat (make-rat -3 -9)) + +(display "\n\nex-2.2") + diff --git a/util.scm b/util.scm new file mode 100644 index 0000000..5c3360f --- /dev/null +++ b/util.scm @@ -0,0 +1,13 @@ +(define (assert a b) + (cond ((equal? a b) (display "[ok]")) + (else + (display "[error] ") + (display a) + (display " != ") + (display b))) + (newline)) + +(define (gcd a b) + (if (= b 0) (abs a) (gcd b (remainder a b)))) + +;(assert (gcd 93 15) 3)