annotate 6-Clojure/collection-type.clj @ 79:29025305bbb7

Add notes and exercises from Day 1 of Clojure
author IBBoard <dev@ibboard.co.uk>
date Sat, 01 Jun 2019 20:10:59 +0100
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
79
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
1 (def classmap {
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
2 "class clojure.lang.PersistentArrayMap" :map,
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
3 "class clojure.lang.PersistentTreeMap" :map,
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
4 "class clojure.lang.PersistentList$EmptyList" :list,
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
5 "class clojure.lang.PersistentList" :list,
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
6 "class clojure.lang.PersistentVector" :vector,
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
7 "class clojure.lang.PersistentTreeSet" :set,
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
8 "class clojure.lang.PersistentHashSet" :set
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
9 })
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
10 (defn collection-type [col]
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
11 "Writes :list, :map, set or :vector based on the collection's type"
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
12 ; There's probably a better way that accounts for inheritance,
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
13 ; but this works and uses the "map is a function with a lookup" approach!!
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
14 ;
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
15 ; We can't do this with classes directly, because of "java.lang.IllegalArgumentException: Duplicate key: (class ())"
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
16 ; because of a clash with (class []), even though they're different and (hash …) gives different answers!
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
17 (classmap (str (class col))))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
18
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
19 (println (collection-type ()))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
20 (println (collection-type (list 1 2 3)))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
21 (println (collection-type []))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
22 (println (collection-type [1 2 3]))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
23 (println (collection-type #{}))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
24 (println (collection-type (sorted-set)))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
25 (println (collection-type (sorted-map)))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
26 (println (collection-type {}))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
27 (println (collection-type "not a collection"))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
28 (println)
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
29
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
30
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
31 (def classmap2 {
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
32 (class {}) :map,
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
33 (class (sorted-map)) :map,
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
34 (class ()) :list,
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
35 (class (list 1)) :list,
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
36 (class #{}) :set,
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
37 (class (sorted-set)) :set
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
38 })
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
39 (defn collection-type2 [col]
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
40 "Writes :list, :map, set or :vector based on the collection's type"
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
41 ; There's probably a better way that accounts for inheritance,
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
42 ; but this works and uses the "map is a function with a lookup" approach!!
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
43 ;
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
44 ; The first IF works around the duplicate key issue (at least with this implementation of maps)
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
45 (if (= (class []) (class col)) :vector (classmap2 (class col))))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
46
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
47 (println (collection-type2 ()))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
48 (println (collection-type2 (list 1 2 3)))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
49 (println (collection-type2 []))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
50 (println (collection-type2 [1 2 3]))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
51 (println (collection-type2 #{}))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
52 (println (collection-type2 (sorted-set)))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
53 (println (collection-type2 (sorted-map)))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
54 (println (collection-type2 {}))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
55 (println (collection-type2 "not a collection"))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
56 (println)
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
57
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
58 ; Use (bases <class>) to find the parent classes
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
59 (defn collection-type3 [col]
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
60 "Writes :list, :map, set or :vector based on the collection's type"
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
61 (let [col_class (class col)]
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
62 (if (isa? col_class clojure.lang.IPersistentList) :list
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
63 (if (isa? col_class clojure.lang.APersistentVector) :vector
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
64 (if (isa? col_class clojure.lang.APersistentMap) :map
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
65 (if (isa? col_class clojure.lang.APersistentSet) :set)
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
66 )
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
67 )
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
68 )
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
69 )
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
70 )
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
71
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
72 (println (collection-type3 ()))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
73 (println (collection-type3 (list 1 2 3)))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
74 (println (collection-type3 []))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
75 (println (collection-type3 [1 2 3]))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
76 (println (collection-type3 #{}))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
77 (println (collection-type3 (sorted-set)))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
78 (println (collection-type3 (sorted-map)))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
79 (println (collection-type3 {}))
29025305bbb7 Add notes and exercises from Day 1 of Clojure
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
80 (println (collection-type3 "not a collection"))