blob: 2915203bdf46c48b885d3c9feb88f5197807e103 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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))
|