;;; -*-Scheme-*-

(define (rat? r) (and (pair? r)
		      (integer? (car r))
		      (integer? (cdr r))
		      (positive? (cdr r))))

(define (rat+ . args)
  (if (memq #f (map rat? args))
      (display "Wrong argument type in rat+")
      (let* ((denominator (abs (apply lcm (map cdr args))))
	     (numerator (apply + (map (lambda (quotient)
				      (* (car quotient)
					 (/ denominator (cdr quotient))))
				      args)))
	     (common-divisor (abs (gcd numerator denominator))))
	(cons (/ numerator common-divisor)
	      (/ denominator common-divisor)))))

(print (rat+ 1 2))
(print (rat+ '(1 . 3) '(1 . 7)))
(print (rat+ (rat+ '(1 . 2) '(1 . 4)) '(1 . 4)))
