(defun add-rat (x y) (make-rat (+ (* (numer x) (denom y)) (* (numer y) (denom x))) (* (denom x) (denom y)))) (defun sub-rat (x y) (make-rat (- (* (numer x) (denom y)) (* (numer y) (denom x))) (* (denom x) (denom y)))) (defun mul-rat (x y) (make-rat (* (numer x) (numer y)) (* (denom x) (denom y)))) (defun div-rat (x y) (make-rat (* (numer x) (denom y)) (* (numer y) (denom x)))) (defun equal-ratp (x y) (= (* (numer x) (denom y)) (* (numer y) (denom x)))) (defun make-rat (n d) (let ((g (gcd n d))) (cons (/ n g) (/ d g)))) (defun numer (x) (car x)) (defun denom (x) (cdr x)) (defun print-rat (x) (format t "~a/" (numer x)) (format t "~a~%" (denom x))) ;; Exercise 2.2 (defun make-segment (start end) (cons (make-point (x-point start) (y-point start)) (make-point (x-point end) (y-point end)))) (defun start-segment (segment) (car segment)) (defun end-segment (segment) (cdr segment)) (defun average (x y) (/ (+ x y) 2)) (defun midpoint-segment (segment) (make-point (average (x-point (start-segment segment)) (x-point (end-segment segment))) (average (y-point (start-segment segment)) (y-point (end-segment segment))))) (defun make-point (x y) (cons x y)) (defun x-point (point) (car point)) (defun y-point (point) (cdr point)) (defun print-point (p) (format t "(~a,~a)~%" (x-point p) (y-point p)))