]> git.rkrishnan.org Git - sicp.git/blob - src/sicp/ch2_1.clj
solutions to 4.38, 4.39 and 4.40
[sicp.git] / src / sicp / ch2_1.clj
1 (ns sicp.ch2_1
2   (:use [sicp utils]
3         [clojure.contrib test-is]))
4
5
6 ;; 2.1.1
7 (declare make-rat numer denom)
8
9 (defn add-rat [x y]
10   (make-rat (+ (* (numer x) (denom y))
11                (* (numer y) (denom x)))
12             (* (denom x) (denom y))))
13
14 (defn sub-rat [x y]
15   (make-rat (- (* (numer x) (denom y))
16                (* (numer y) (denom x)))
17             (* (denom x) (denom y))))
18
19 (defn mul-rat [x y]
20   (make-rat (* (numer x) (numer y))
21             (* (denom x) (denom y))))
22
23 (defn div-rat [x y]
24   (make-rat (* (numer x) (denom y))
25             (* (numer y) (denom x))))
26
27 (defn equal-rat? [x y]
28   (= (* (numer x) (denom y))
29      (* (denom x) (numer y))))
30
31 ;; until now, we haven't even defined the data representation.
32 ;; now define make-rat numer and denom.
33 (defn make-rat [x y]
34   (let [g (gcd x y)]
35     (list (/ x g)
36           (/ y g))))
37
38 (defn numer [x]
39   (first x))
40
41 (defn denom [x]
42   (first (rest x)))
43
44 (defn print-rat [x]
45   (println (numer x)"/"(denom x)))
46
47 ;;; 2.1.3
48 ;; scheme/CL cons is nothing but a way to represent a pair.
49 (defn s-cons [x y]
50   (fn [m] (cond (= m 0) x
51                 (= m 1) y
52                 :else (str "argument not 0 or 1 - s-cons"))))
53
54 (defn car [z] (z 0))
55
56 (defn cdr [z] (z 1))
57
58 (def x (s-cons 2 3))
59 (car x) ;;=> 2
60 (cdr x) ;;=> 3