practice / blog

For personal blogging
1 stars 0 forks source link

Unknown pearls from the Clojure standard library - Renzo Borgatti 요약 #35

Open practice opened 7 years ago

practice commented 7 years ago

destructure

(destructure '[[x y & others] v])
=>
[vec__13737 v
 x (nth vec__13737 0 nil)
 y (nth vec__13737 1 nil)
 others (nthnext vec__13737 2)]
(reductions + (range 10))
=> (0 1 3 6 10 15 21 28 36 45)
(defn add+
  {:test #(do 
           (assert (= (add+ 2 3) 5))
           (assert (= (add+ 4 4) 8)))}
  [x y] (+ x y))
=> #'cedsd.core/add+
(test #'add+)
=> :ok

https://clojuredocs.org/clojure.pprint/cl-format 를 참고하자.

clojure.java.browse/browse-url

(clojure.java.browse/browse-url "http://google.com")
(clojure.java.javadoc/javadoc (list* 1 []))

clojure.reflect/reflect

(require '[clojure.reflect :refer [reflect]])
=> nil
((with-out-str (clojure.pprint/write (reflect :a))))
ClassCastException java.lang.String cannot be cast to clojure.lang.IFn  cedsd.core/eval15665 (form-init4770793195341058308.clj:1)
(with-out-str (clojure.pprint/write (reflect :a)))

clojure.inspector/inspect-tree

(require '[clojure.inspector :as inspector])
=> nil
(def m {:a "a"
        :b {:c "c"
            :d [1 2 3]
            :e {:f "f"
                :g "g"
                :h "h"}}
        :i [1 2 3]
        :l {:m "m"
            :n "n"}
        :o [{:p "p" :q "q"}]})
=> #'cedsd.core/m
(inspector/inspect-tree m)
(def e (PersistentQueue/EMPTY))
=> #'cedsd.core/e
(reductions conj e (range 10))
=>
(#object[clojure.lang.PersistentQueue 0x1fac2484 "clojure.lang.PersistentQueue@1"]
 #object[clojure.lang.PersistentQueue 0x241a426c "clojure.lang.PersistentQueue@1f"]
 #object[clojure.lang.PersistentQueue 0x4f2efe4d "clojure.lang.PersistentQueue@3c2"]
 #object[clojure.lang.PersistentQueue 0x39147f54 "clojure.lang.PersistentQueue@7480"]
 #object[clojure.lang.PersistentQueue 0x47e2f4f6 "clojure.lang.PersistentQueue@e1b83"]
 #object[clojure.lang.PersistentQueue 0x319dd744 "clojure.lang.PersistentQueue@1b554e1"]
 #object[clojure.lang.PersistentQueue 0x9799bac "clojure.lang.PersistentQueue@34f54744"]
 #object[clojure.lang.PersistentQueue 0x130dab08 "clojure.lang.PersistentQueue@69b3a142"]
 #object[clojure.lang.PersistentQueue 0x4318b8db "clojure.lang.PersistentQueue@ccc08705"]
 #object[clojure.lang.PersistentQueue 0x1ce0700b "clojure.lang.PersistentQueue@cb5059a3"]
 #object[clojure.lang.PersistentQueue 0x59812cc0 "clojure.lang.PersistentQueue@9ebadac6"])
(map seq (reductions conj e (range 10)))
=>
(nil
 (0)
 (0 1)
 (0 1 2)
 (0 1 2 3)
 (0 1 2 3 4)
 (0 1 2 3 4 5)
 (0 1 2 3 4 5 6)
 (0 1 2 3 4 5 6 7)
 (0 1 2 3 4 5 6 7 8)
 (0 1 2 3 4 5 6 7 8 9))
(def buf (reduce conj e (range 10)))
=> #'cedsd.core/buf
(peek buf)
=> 0
(pop buf)
=> #object[clojure.lang.PersistentQueue 0x4ce6b71b "clojure.lang.PersistentQueue@fe1f9924"]
(peek (pop buf))
=> 1
(peek (pop (pop buf)))
=> 2
(def m {:host "127.0.0.1" :port nil})
=> #'cedsd.core/m
(update m :port (fnil #(Integer/parseInt %) "80"))
=> {:host "127.0.0.1", :port 80}
(def m {:host "127.0.0.1" :port "8080"})
=> #'cedsd.core/m
(update m :port (fnil #(Integer/parseInt %) "80"))
=> {:host "127.0.0.1", :port 8080}
practice commented 7 years ago

Honorable mentions

Tutorials on zippers: