; rational numbers
(define (frac n d)
(if (zero? d) (error 'frac "can't have zero denominator")
(if (negative? d) (frac (- n) (- d))
(let ((g (gcd n d)))
(if (= g 1) (cons n d)
(cons (/ n g) (/ d g)))))))
(define (plus x y)
(let ((a (car x)) (b (cdr x)) (c (car y)) (d (cdr y)))
(frac (+ (* a d) (* b c)) (* b d))))
(define (minus x y)
(let ((a (car x)) (b (cdr x)) (c (car y)) (d (cdr y)))
(frac (- (* a d) (* b c)) (* b d))))
(define (times x y)
(let ((a (car x)) (b (cdr x)) (c (car y)) (d (cdr y)))
(frac (* a c) (* b d))))
(define (divide x y)
(let ((a (car x)) (b (cdr x)) (c (car y)) (d (cdr y)))
(frac (* a d) (* b c))))
(define (less-than? x y)
(let ((a (car x)) (b (cdr x)) (c (car y)) (d (cdr y)))
(< (* a d) (* b c))))
(display (plus (frac 1 3) (frac -1 7))) (newline)
(display (minus (frac 1 3) (frac -1 7))) (newline)
(display (times (frac 1 3) (frac -1 7))) (newline)
(display (divide (frac 1 3) (frac -1 7))) (newline)
(display (less-than? (frac 1 3) (frac -1 7))) (newline)