about summary refs log tree commit diff
path: root/sicp/chapter2.rkt
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))