diff options
Diffstat (limited to 'sicp/chapter2.rkt')
-rw-r--r-- | sicp/chapter2.rkt | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/sicp/chapter2.rkt b/sicp/chapter2.rkt new file mode 100644 index 0000000..2915203 --- /dev/null +++ b/sicp/chapter2.rkt @@ -0,0 +1,52 @@ +#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)) |