]> git.rkrishnan.org Git - sicp.git/blob - src/sicp/ch2_2.clj
starting with section 2.2.2
[sicp.git] / src / sicp / ch2_2.clj
1 (ns sicp.ch2_2)
2
3 (cons 1
4       (cons 2
5             (cons 3
6                   (cons 4 nil))))
7 ;;=> (1 2 3 4)
8 (list 1 2 3 4)
9
10 (def one-thru-four (list 1 2 3 4))
11 ;;=> #'user/one-thru-four
12 (first one-thru-four)
13 ;;=> 1
14 (rest one-thru-four)
15 ;;=> (2 3 4)
16 (cons 10 one-thru-four)
17 ;;=> (10 1 2 3 4)
18 (cons 5 one-thru-four)
19 ;;=> (5 1 2 3 4)
20
21 ;; get nth element of a list
22 (defn list-ref [items n]
23   (if (= n 0)
24     (first items)
25     (list-ref (rest items) (- n 1))))
26
27 (list-ref one-thru-four 3)
28 ;;=> 4
29 (list-ref one-thru-four 5)
30 ;;=> nil
31 (list-ref one-thru-four 1)
32 ;;=> 2
33 (list-ref one-thru-four 0)
34 ;;=> 1
35
36 (defn length [items]
37   (if (empty? items)
38     0
39     (+ 1 (length (rest items)))))
40
41 (length one-thru-four)
42 ;;=> 4
43
44 (defn- length-i [items n]
45   (if (empty? items)
46     n
47     (length-i (rest items) (+ 1 n))))
48
49 (defn length-iter [items]
50   (length-i items 0))
51
52 (length-iter one-thru-four)
53 ;;=> 4
54
55 (defn append [list1 list2]
56   (if (empty? list1)
57     list2
58     (cons (first list1)
59           (append (rest list1) list2))))
60
61 (append one-thru-four one-thru-four)
62 ;;=> (1 2 3 4 1 2 3 4)
63
64 ;; mapping over lists
65 (defn scale-list [items factor]
66   (if (empty? items)
67     nil
68     (cons (* factor (first items))
69           (scale-list (rest items) factor))))
70
71 (defn map [proc items]
72   (if (empty? items)
73     nil
74     (cons (proc (first items))
75           (map proc (rest items)))))
76
77 (defn scale-list-with-map [items factor]
78   (map (fn [item] (* item factor)) items))
79
80 ;; 2.2.2
81 (def x (cons (list 1 2) (list 3 4)))
82
83 (length x)
84 ;;=> 3
85
86 ;; count-leaves
87 (defn count-leaves [coll]
88   (cond (nil? coll)       0
89         (not (seq? coll)) 1
90         :else (+ (count-leaves (first coll))
91                  (count-leaves (next coll)))))