2 (:refer-clojure :exclude (map))
3 (:use (sicp [ch1-2 :only (fib)])))
12 (def one-thru-four (list 1 2 3 4))
13 ;;=> #'user/one-thru-four
18 (cons 10 one-thru-four)
20 (cons 5 one-thru-four)
23 ;; get nth element of a list
24 (defn list-ref [items n]
27 (list-ref (rest items) (- n 1))))
29 (list-ref one-thru-four 3)
31 (list-ref one-thru-four 5)
33 (list-ref one-thru-four 1)
35 (list-ref one-thru-four 0)
41 (+ 1 (length (rest items)))))
43 (length one-thru-four)
46 (defn- length-i [items n]
49 (length-i (rest items) (+ 1 n))))
51 (defn length-iter [items]
54 (length-iter one-thru-four)
57 (defn append [list1 list2]
61 (append (rest list1) list2))))
63 (append one-thru-four one-thru-four)
64 ;;=> (1 2 3 4 1 2 3 4)
67 (defn scale-list [items factor]
70 (cons (* factor (first items))
71 (scale-list (rest items) factor))))
73 (defn map [proc items]
76 (cons (proc (first items))
77 (map proc (rest items)))))
79 (defn scale-list-with-map [items factor]
80 (map (fn [item] (* item factor)) items))
83 (def x (cons (list 1 2) (list 3 4)))
89 (defn count-leaves [coll]
92 :else (+ (count-leaves (first coll))
93 (count-leaves (next coll)))))
96 (defn scale-tree [tree factor]
98 (not (seq? tree)) (* tree factor)
99 :else (cons (scale-tree (first tree) factor)
100 (scale-tree (next tree) factor))))
103 (defn scale-tree-with-map [tree factor]
106 (scale-tree-with-map sub-tree factor)
107 (* sub-tree factor)))
111 (defn sum-odd-squares [tree]
113 (not (seq? tree)) (if (odd? tree)
114 ((fn [x] (* x x)) tree)
116 :else (+ (sum-odd-squares (first tree))
117 (sum-odd-squares (next tree)))))
120 (letfn [(next-fib [k]
125 (cons f (next-fib (+ k 1)))
126 (next-fib (+ k 1))))))]
129 (map #(* % %) (list 1 2 3 4 5))
131 (defn myfilter-1 [pred? xs]
133 (not (seq? xs)) (if (pred? xs)
136 :else (concat (myfilter-1 pred? (first xs))
137 (myfilter-1 pred? (next xs)))))
139 (defn myfilter-2 [pred? xs]
141 (pred? (first xs)) (cons (first xs)
142 (myfilter-2 pred? (next xs)))
143 :else (myfilter-1 pred? (next xs))))
146 (defn accumulate [op init xs]
150 (accumulate op init (next xs)))))
152 (defn enumerate-interval
154 (enumerate-interval 0 high))
158 (cons low (enumerate-interval (+ low 1) high)))))