#lang sicp ; Exercise 2.1 (define (make-rat n d) (if (< d 0) (make-rat (- n) (- d)) (let ((g (gcd n d))) (cons (/ n g) (/ d g))))) (define numer car) (define denom cdr) (define (print-rat x) (display (numer x)) (display "/") (display (denom x)) (newline)) (define (add-rat x y) (let ((dx (denom x)) (dy (denom y))) (make-rat (+ (* (numer x) dy) (* (numer y) dx)) (* dx dy)))) (define (sub-rat x y) (add-rat x (make-rat (- (numer y)) (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)))) ; Exercise 2.2 (define make-point cons) (define x-point car) (define y-point cdr) (define make-segment cons) (define start-segment car) (define end-segment cdr) (define (average x y) (/ (+ x y) 2)) (define (midpoint-segment d) (let ((A (start-segment d)) (B (end-segment d))) (make-point (average (x-point A) (x-point B)) (average (y-point A) (y-point B))))) (define (print-point P) (display "(") (display (x-point P)) (display ", ") (display (y-point P)) (display ")") (newline))