Last active
July 1, 2016 03:23
-
-
Save coxchen/a6572dc76abc54e6b9ef9805a0c5547d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; 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'>"Smooches McCutes"</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