练习2.01
(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)))))
(define (numer x) (car x))
(define (demon y) (cdr y))
(define (print-rat x)
(display (numer x))
(display "/")
(display (demon x))
(newline))
练习2.02
(define (print-point p)
(display "(")
(display (x-point p))
(display ",")
(display (y-point p))
(display ")")
(newline))
(define (make-point x y)
(cons x y))
(define (x-point p) (car p))
(define (y-point p) (cdr p))
(define (make-segment p1 p2)
(cons p1 p2))
(define (start-segment s) (car s))
(define (end-segment s) (cdr s))
(define (midpoint-segment s)
(let ((startpoint (start-segment s))
(endpoint (end-segment s)))
(let ((startpoint-x (x-point startpoint))
(startpoint-y (y-point startpoint))
(endpoint-x (x-point endpoint))
(endpoint-y (y-point endpoint)))
(make-point (/ (+ startpoint-x endpoint-x) 2)
(/ (+ startpoint-y endpoint-y) 2)))))
练习2.03
(define (make-point x y)
(cons x y))
(define (make-segment p1 p2)
(cons p1 p2))
(define (make-rectangle s1 s2)
(cons (get-length s1)
(get-length s2)))
(define (get-length s)
(sqrt (+ (square (- (car (car s)) (car (cdr s))))
(square (- (cdr (car s)) (cdr (cdr s)))))))
(define (perimeter r)
(* 2 (+ (car r)
(cdr r))))
(define (area r)
(* (car r)
(cdr r)))
(define a (make-point 0 0))
(define b (make-point 0 1))
(define c (make-point 2 1))
(define s1 (make-segment a b))
(define s2 (make-segment b c))
(define r (make-rectangle s1 s2))
(display (perimeter r))
(newline)
(display (area r)
(newline))