Exercise 3.1
(str "a" "b" "c")
;; => "abc"
(vector 1 2 3)
;; => [1 2 3]
(list 1 2 3)
;; => (1 2 3)
(hash-map 1 2 3 1)
;; => {1 2, 3 1}
(hash-set 1 2 3 1)
;; => #{1 3 2}
Exercise 3.2
(defn ex2 [number]
(+ number 100))
Exercise 3.3
(defn dec-maker [d]
(fn [x] (- x d)))
(def dec9 (dec-maker 9))
(dec9 10)
;; => 1
Exercise 3.4
(defn mapset
[f col]
(reduce (fn [rst x]
(conj rst (f x)))
#{}
col))
(mapset inc [1 1 2 2])
;; => #{3 2}
Exercise 3.5
(def asym-alien-body-parts [{:name "head" :size 3}
{:name "1st-eye" :size 1}
{:name "1st-ear" :size 1}
{:name "mouth" :size 1}
{:name "nose" :size 1}
{:name "neck" :size 2}
{:name "1st-shoulder" :size 3}
{:name "1st-upper-arm" :size 3}
{:name "chest" :size 10}
{:name "back" :size 10}
{:name "1st-forearm" :size 3}
{:name "abdomen" :size 6}
{:name "1st-kidney" :size 1}
{:name "1st-hand" :size 2}
{:name "1st-knee" :size 2}
{:name "1st-thigh" :size 4}
{:name "1st-lower-leg" :size 3}
{:name "1st-achilles" :size 1}
{:name "1st-foot" :size 2}])
(defn nth-matching-part [part nth]
{:name (clojure.string/replace (:name part) #"^1st-" (str nth "-"))
:size (:size part)})
(defn alien-all-parts
[part]
(conj (mapset (fn [nth] (nth-matching-part part nth))
["2nd" "3rd" "4th" "5th"])
part))
(defn alien-symmetrize-body-parts
"reduce version"
[asym-body-parts]
(reduce (fn [rst part]
(into rst (alien-all-parts part)))
[]
asym-body-parts))
Exercise 3.6
(def asym-general-body-parts [{:name "head" :size 3}
{:name "1-eye" :size 1}
{:name "1-ear" :size 1}
{:name "mouth" :size 1}
{:name "nose" :size 1}
{:name "neck" :size 2}
{:name "1-shoulder" :size 3}
{:name "1-upper-arm" :size 3}
{:name "chest" :size 10}
{:name "back" :size 10}
{:name "1-forearm" :size 3}
{:name "abdomen" :size 6}
{:name "1-kidney" :size 1}
{:name "1-hand" :size 2}
{:name "1-knee" :size 2}
{:name "1-thigh" :size 4}
{:name "1-lower-leg" :size 3}
{:name "1-achilles" :size 1}
{:name "1-foot" :size 2}])
(defn all-parts
[part n-to-add]
(conj (mapset (fn [n] {:name (clojure.string/replace
(:name part)
#"^1-"
(str n "-"))
:size (:size part)})
(range 2 (+ 2 n-to-add)))
part))
(defn general-symmetrize-body-parts
[asym-body-parts n-to-add]
(reduce (fn [rst part]
(into rst (all-parts part n-to-add)))
[]
asym-body-parts))