]> git.rkrishnan.org Git - sicp.git/blob - src/sicp/ch2_2.clj
started with section 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)