Skip to content

Instantly share code, notes, and snippets.

@coxchen
Last active July 1, 2016 03:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save coxchen/a6572dc76abc54e6b9ef9805a0c5547d to your computer and use it in GitHub Desktop.
Save coxchen/a6572dc76abc54e6b9ef9805a0c5547d to your computer and use it in GitHub Desktop.
;; gorilla-repl.fileformat = 1
;; **
;;; # Clojure for Brave and True
;;;
;;; ## CH5 Exercises
;; **
;; @@
(ns braveclojure-ch5)
;; @@
;; =>
;;; {"type":"html","content":"<span class='clj-nil'>nil</span>","value":"nil"}
;; <=
;; @@
(def character
{:name "Smooches McCutes"
:attributes {:intelligence 10
:strength 4
:dexterity 5}})
(def c-int (comp :intelligence :attributes))
(defn attr [k] (comp k :attributes))
(do
(assert (= ((attr :intelligence) character)
(c-int character)))
((attr :intelligence) character))
; => 10
;; @@
;; =>
;;; {"type":"html","content":"<span class='clj-long'>10</span>","value":"10"}
;; <=
;; @@
;; ex-2, comp
(defn my-comp
([] identity)
([ & fns]
(fn [ & args]
(loop [result (apply (last fns) args) rest-fns (drop-last fns)]
(println rest-fns result)
(if (empty? rest-fns)
result
(recur ((last rest-fns) result) (drop-last rest-fns)))))))
((my-comp :intelligence :attributes) character)
;; @@
;; ->
;;; (:intelligence) {:intelligence 10, :strength 4, :dexterity 5}
;;; () 10
;;;
;; <-
;; =>
;;; {"type":"html","content":"<span class='clj-long'>10</span>","value":"10"}
;; <=
;; @@
(for [p [[] [:attributes] [:intelligence :attributes]]]
(do
(assert (= ((apply my-comp p) character)
((apply comp p) character)))
((apply my-comp p) character)))
;; @@
;; =>
;;; {"type":"list-like","open":"<span class='clj-lazy-seq'>(</span>","close":"<span class='clj-lazy-seq'>)</span>","separator":" ","items":[{"type":"list-like","open":"<span class='clj-map'>{</span>","close":"<span class='clj-map'>}</span>","separator":", ","items":[{"type":"list-like","open":"","close":"","separator":" ","items":[{"type":"html","content":"<span class='clj-keyword'>:name</span>","value":":name"},{"type":"html","content":"<span class='clj-string'>&quot;Smooches McCutes&quot;</span>","value":"\"Smooches McCutes\""}],"value":"[:name \"Smooches McCutes\"]"},{"type":"list-like","open":"","close":"","separator":" ","items":[{"type":"html","content":"<span class='clj-keyword'>:attributes</span>","value":":attributes"},{"type":"list-like","open":"<span class='clj-map'>{</span>","close":"<span class='clj-map'>}</span>","separator":", ","items":[{"type":"list-like","open":"","close":"","separator":" ","items":[{"type":"html","content":"<span class='clj-keyword'>:intelligence</span>","value":":intelligence"},{"type":"html","content":"<span class='clj-long'>10</span>","value":"10"}],"value":"[:intelligence 10]"},{"type":"list-like","open":"","close":"","separator":" ","items":[{"type":"html","content":"<span class='clj-keyword'>:strength</span>","value":":strength"},{"type":"html","content":"<span class='clj-long'>4</span>","value":"4"}],"value":"[:strength 4]"},{"type":"list-like","open":"","close":"","separator":" ","items":[{"type":"html","content":"<span class='clj-keyword'>:dexterity</span>","value":":dexterity"},{"type":"html","content":"<span class='clj-long'>5</span>","value":"5"}],"value":"[:dexterity 5]"}],"value":"{:intelligence 10, :strength 4, :dexterity 5}"}],"value":"[:attributes {:intelligence 10, :strength 4, :dexterity 5}]"}],"value":"{:name \"Smooches McCutes\", :attributes {:intelligence 10, :strength 4, :dexterity 5}}"},{"type":"list-like","open":"<span class='clj-map'>{</span>","close":"<span class='clj-map'>}</span>","separator":", ","items":[{"type":"list-like","open":"","close":"","separator":" ","items":[{"type":"html","content":"<span class='clj-keyword'>:intelligence</span>","value":":intelligence"},{"type":"html","content":"<span class='clj-long'>10</span>","value":"10"}],"value":"[:intelligence 10]"},{"type":"list-like","open":"","close":"","separator":" ","items":[{"type":"html","content":"<span class='clj-keyword'>:strength</span>","value":":strength"},{"type":"html","content":"<span class='clj-long'>4</span>","value":"4"}],"value":"[:strength 4]"},{"type":"list-like","open":"","close":"","separator":" ","items":[{"type":"html","content":"<span class='clj-keyword'>:dexterity</span>","value":":dexterity"},{"type":"html","content":"<span class='clj-long'>5</span>","value":"5"}],"value":"[:dexterity 5]"}],"value":"{:intelligence 10, :strength 4, :dexterity 5}"},{"type":"html","content":"<span class='clj-long'>10</span>","value":"10"}],"value":"(() {:intelligence 10, :strength 4, :dexterity 5}\n() {:intelligence 10, :strength 4, :dexterity 5}\n(:intelligence) {:intelligence 10, :strength 4, :dexterity 5}\n() 10\n(:intelligence) {:intelligence 10, :strength 4, :dexterity 5}\n() 10\n{:name \"Smooches McCutes\", :attributes {:intelligence 10, :strength 4, :dexterity 5}} {:intelligence 10, :strength 4, :dexterity 5} 10)"}
;; <=
;; @@
;; ex-3, assoc-in
(defn my-assoc-in [m [k & ks] v]
(assoc m k (if (not-empty ks)
(my-assoc-in (get m k) ks v)
v)))
(let [p [:a :b 1]]
(assert (= (my-assoc-in {} p :c)
(assoc-in {} p :c)))
(my-assoc-in {} p :c))
;; @@
;; =>
;;; {"type":"list-like","open":"<span class='clj-map'>{</span>","close":"<span class='clj-map'>}</span>","separator":", ","items":[{"type":"list-like","open":"","close":"","separator":" ","items":[{"type":"html","content":"<span class='clj-keyword'>:a</span>","value":":a"},{"type":"list-like","open":"<span class='clj-map'>{</span>","close":"<span class='clj-map'>}</span>","separator":", ","items":[{"type":"list-like","open":"","close":"","separator":" ","items":[{"type":"html","content":"<span class='clj-keyword'>:b</span>","value":":b"},{"type":"list-like","open":"<span class='clj-map'>{</span>","close":"<span class='clj-map'>}</span>","separator":", ","items":[{"type":"list-like","open":"","close":"","separator":" ","items":[{"type":"html","content":"<span class='clj-long'>1</span>","value":"1"},{"type":"html","content":"<span class='clj-keyword'>:c</span>","value":":c"}],"value":"[1 :c]"}],"value":"{1 :c}"}],"value":"[:b {1 :c}]"}],"value":"{:b {1 :c}}"}],"value":"[:a {:b {1 :c}}]"}],"value":"{:a {:b {1 :c}}}"}
;; <=
;; @@
;; ex-4, update-in
(defn my-update-in [m [k & ks] f & args]
(assoc m k (if (not-empty ks)
(apply my-update-in (get m k) ks f args)
(apply f (get m k) args))))
(let [p [:a :b :c]
m (my-assoc-in {} p 1)]
(assert (= (my-update-in m p inc)
(update-in m p inc)))
(my-update-in m p inc))
;; @@
;; =>
;;; {"type":"list-like","open":"<span class='clj-map'>{</span>","close":"<span class='clj-map'>}</span>","separator":", ","items":[{"type":"list-like","open":"","close":"","separator":" ","items":[{"type":"html","content":"<span class='clj-keyword'>:a</span>","value":":a"},{"type":"list-like","open":"<span class='clj-map'>{</span>","close":"<span class='clj-map'>}</span>","separator":", ","items":[{"type":"list-like","open":"","close":"","separator":" ","items":[{"type":"html","content":"<span class='clj-keyword'>:b</span>","value":":b"},{"type":"list-like","open":"<span class='clj-map'>{</span>","close":"<span class='clj-map'>}</span>","separator":", ","items":[{"type":"list-like","open":"","close":"","separator":" ","items":[{"type":"html","content":"<span class='clj-keyword'>:c</span>","value":":c"},{"type":"html","content":"<span class='clj-long'>2</span>","value":"2"}],"value":"[:c 2]"}],"value":"{:c 2}"}],"value":"[:b {:c 2}]"}],"value":"{:b {:c 2}}"}],"value":"[:a {:b {:c 2}}]"}],"value":"{:a {:b {:c 2}}}"}
;; <=
;; @@
;; @@
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment