際際滷

際際滷Share a Scribd company logo
Episode VI:
                             Clojure
                           舒于舒仆亠仂 仆舒 亢亠亟舒亳亠




Saturday, November 3, 12
Saturday, November 3, 12
bozhidar

                           user> (:twitter bozhidar)
                           "@bbatsov"
                           user> (bozhidar :blog)
                           "http://batsov.com"
                           user> (:github bozhidar)
                           "http://github.com/bbatsov"



Saturday, November 3, 12
http://tradeo.com
Saturday, November 3, 12
Saturday, November 3, 12
@emacs_knight
Saturday, November 3, 12
亠从亳
Saturday, November 3, 12
亠从舒
Saturday, November 3, 12
亠从舒 亳 仂仄仗ム
Saturday, November 3, 12
舒仂 仄 从?



Saturday, November 3, 12
仂亞舒仄亳亳亠 舒 亳亟亳仂亳!
Saturday, November 3, 12
舒仆舒仍亳 仄亠 亟仂 亳 于
                     从舒仍舒 仆舒亠亠仆舒
                亳仆亳亟亠仆仆舒 仍仂亢仆仂
                 亳 于仂弍亠 仆亠 亳 亟舒于舒仄亠
                     仄亠从舒 亰舒 仂于舒...

Saturday, November 3, 12
public boolean hasUpperCase(String word) {
                               if (word == null) {
                                   return false;
                               }
                               int len = word.length();
                               for (int i = 0; i < len; i++) {
                                   if (Character.isUpperCase(word.charAt(i))) {
                                       return true;
                                   }
                               }
                               return false;
                           }




         (defn has-uppercase? [string]
           (some #(Character/isUpperCase %) string))



Saturday, November 3, 12
仂于仂仂 亠 亟仂弍亠
                           亰舒弍舒于亠仆仂 舒仂.


Saturday, November 3, 12
仂仆于亠仆亳仂仆舒仍亠仆 亠亰亳从 亰舒
                               仗仂亞舒仄亳舒仆亠
Saturday, November 3, 12
丼亳舒于 亠亰亳从 亰舒 仗仂亞舒仄亳舒仆亠
Saturday, November 3, 12
个仆从亳仂仆舒仍亠仆 亠亰亳从 亰舒
                              仗仂亞舒仄亳舒仆亠
Saturday, November 3, 12
Common Lisp
Saturday, November 3, 12
Clojure
Saturday, November 3, 12
Lisp




Saturday, November 3, 12
Saturday, November 3, 12
舒亞亳舒 仆舒 Lisp
                     仂仍仂于亳仆 于亠从仂于仆舒 亳仂亳
                     丼亠仂 亳仄亳亳舒仆, 于亠仆仂 仆亠仆舒亟仄亳仆舒
                     亰从仍ム亳亠仍仆仂 仄舒仍从仂 磲仂
                     仂亳 仆亳从舒从于 亳仆舒从亳
                     仂亟 亠 亟舒仆仆亳 (code is data)
                     仆亠舒从亳于仆仂 仗仂亞舒仄亳舒仆亠
Saturday, November 3, 12
仂弍仍亠仄亳亠 仆舒 Lisp
                   (Common Lisp/Scheme)
                     亳从舒从于舒 亳仆仂于舒亳 仍亠亟
                           舒仆亟舒亳亰亳舒仆亠仂 亳仄
                     弌亠亞仄亠仆舒亳
                     仄舒舒 亠亟仆仂于亠仄亠仆仆仂 (concurrently) 仆亠
                           亠 仗仂仄亠仆舒于舒 于 仗亠亳亳从舒亳亳亠 亳仄
                     仂于亠亠仂 Lisp-仂于亠 亟亠亳仆亳舒 舒仄亳
                           于仂舒 仗仍舒仂仄舒


Saturday, November 3, 12
亳仆从亳亠 仄亢亠 仆亠 亞亳 亠 舒 仂
                           仄舒仍从仂 从仂弍亳!
Saturday, November 3, 12
丱仂舒舒 亳仄舒
                           仆亠仗亳仆亳 仆舒于亳从 亟舒
                              弍从舒 亟仄亳亠
                               仗仂亰仆舒仂 亳
                              亳仆亳亳于仆仂.

Saturday, November 3, 12
"We were after the C++ programmers.
                  We managed to drag a lot of them about
                            halfway to Lisp."
Saturday, November 3, 12
Ruby was a Lisp originally, in theory.




                 Ruby was a Lisp originally, in theory.

Saturday, November 3, 12
仂仍礆舒 舒 仂
                   亠亰亳亳亠, 从仂亳仂 舒于舒
                   亰舒 仆亠仂 舒 仗仂于仍亳礌亳
                   仗磻仂 亳仍亳 从仂于亠仆仂 仂
                          Lisp!!!

Saturday, November 3, 12
个丐!



Saturday, November 3, 12
A language that doesnt affect the way you
                        think about programming is not worth
                                      knowing.

Saturday, November 3, 12
Clojure
Saturday, November 3, 12
亠仆亳舒
                     亳仆舒仄亳亠仆 亠亰亳从 亰舒 仗仂亞舒仄亳舒仆亠
                     JVM/CLR/JavaScript
                     仂亟亠亠仆 亟亳舒仍亠舒从 仆舒 Lisp (1)
                     个仆从亳仂仆舒仍亠仆 仗仂 仗舒从亳亠仆 仆舒亳仆
                     仗亳仄亳亰亳舒仆 亰舒 仗舒舒仍亠仍仆仂 仗仂亞舒仄亳舒仆亠
                     仂亠 亰舒 亠亟亳仆 仗仂-仗仂 于
Saturday, November 3, 12
于仂仍ム亳舒 仆舒 Lisp
                     弍仂亞仂仄 car & cdr (hello 鍖rst & rest)
                     仗仂-仄舒仍从仂 从仂弍亳
                     仗仂于亠亠 从亳 仂 亟舒仆仆亳  literal
                           亳仆舒从亳 (set, map, vector)
                     从仂于舒仆仂 弍亰 runtime
                     舒仆亟舒亳亰亳舒仆 runtime
                     仆亠仗仂仄亠仆亳仄亳 (immutable) 从亳 亟舒仆仆亳
Saturday, November 3, 12
(hello clojure)

                    (defn hello-world []
                      (println "Hello, world!"))

                    (defn hello [name]
                      (println
                       (format "Hello, %s!" name)))




Saturday, November 3, 12
user> (hello-world)
                           Hello, world!
                           nil
                           user> (hello "Bozhidar")
                           Hello, Bozhidar!
                           nil



Saturday, November 3, 12
Lisp programmers know the value of
                 everything, but the cost of nothing.
Saturday, November 3, 12
弌从亳 仂 亟舒仆仆亳

                     于亰舒仆 仗亳从 (list)
                     仄仆仂亢亠于仂 (set)
                     于亠从仂
                     舒仂亳舒亳于亠仆 仄舒亳于 (map/dictionary)
                     于亳从仂 亢舒于亠从仂 亳 仂亟仆仂

Saturday, November 3, 12
弌仗亳从
Saturday, November 3, 12
user> (list 1 2 3)
              (1 2 3)
              user> '(1 2 3)
              (1 2 3)
              user> (def names '("Bozhidar" "Snezhi" "Batman" "Yoda" "Mike"))
              #'user/names
              user> (first names)
              "Bozhidar"
              user> (rest names)
              ("Snezhi" "Batman" "Yoda" "Mike")
              user> (last names)
              "Mike"
              user> (count names)
              5
              user> (map lower-case names)
              ("bozhidar" "snezhi" "batman" "yoda" "mike")
              user> (map count names)
              (8 6 6 4 4)
              user> (apply + (map count names))
              28
              user> (cons "Pesho" names)
              ("Pesho" "Bozhidar" "Snezhi" "Batman" "Yoda" "Mike")
              user> names
              ("Bozhidar" "Snezhi" "Batman" "Yoda" "Mike")
              user> (conj names "Pesho")
              ("Pesho" "Bozhidar" "Snezhi" "Batman" "Yoda" "Mike")
Saturday, November 3, 12
Mutable state is the new spaghetti
                                   code.
Saturday, November 3, 12
user> (filter even? (range 1 10))
  (2 4 6 8)
  user> (every? even? (range 1 10))
  false
  user> (every? even? (filter even? (range 1 10)))
  true
  user> (map #(+ % 5) (range 1 10))
  (6 7 8 9 10 11 12 13 14)
  user> (map (partial + 5) (range 1 10))
  (6 7 8 9 10 11 12 13 14)
  user> (map (comp (partial * 2) (partial + 5))
  (range 1 10))
  (12 14 16 18 20 22 24 26 28)


Saturday, November 3, 12
user> (doc and)
-------------------------
clojure.core/and
([] [x] [x & next])
Macro
  Evaluates exprs one at a time, from left to right. If a form
  returns logical false (nil or false), and returns that value and
  doesn't evaluate any of the other expressions, otherwise it returns
  the value of the last expr. (and) returns true.
nil
user> (source and)
(defmacro and
  "Evaluates exprs one at a time, from left to right. If a form
  returns logical false (nil or false), and returns that value and
  doesn't evaluate any of the other expressions, otherwise it returns
  the value of the last expr. (and) returns true."
  {:added "1.0"}
  ([] true)
  ([x] x)
  ([x & next]
    `(let [and# ~x]
       (if and# (and ~@next) and#))))
nil


Saturday, November 3, 12
仆仂亢亠于仂
                             (Set)


Saturday, November 3, 12
user> (set '(1 1 2 2 3 3))
                 #{1 2 3}
                 user> (def a-set #{1 2 3 4 5})
                 #'user/a-set
                 user> (contains? a-set 3)
                 true
                 user> (contains? a-set 9)
                 false
                 user> (conj a-set 5)
                 #{1 2 3 4 5}
                 user> (conj a-set 6)
                 #{1 2 3 4 5 6}
                 user> (use 'clojure.set)
                 nil
                 user> (intersection #{1 2 3} #{2 3 4})
                 #{2 3}
                 user> (difference #{1 2 3} #{2 3 4})
                 #{1}
                 user> (union #{1 2 3} #{2 3 4})
                 #{1 2 3 4}
Saturday, November 3, 12
仂亳舒亳于亠仆 仄舒亳于
                                 (Map)


Saturday, November 3, 12
user> (hash-map 1 2 3 4)
    {1 2, 3 4}
    user> (hash-map "Batman" "Bruce Wayne" "Superman" "Clark Kent")
    {"Batman" "Bruce Wayne", "Superman" "Clark Kent"}
    user> {:batman "Bruce Wayne", :superman "Clark Kent"}
    {:superman "Clark Kent", :batman "Bruce Wayne"}
    user> (def a-map {:batman "Bruce Wayne", :superman "Clark Kent"})
    #'user/a-map
    user> (:superman a-map)
    "Clark Kent"
    user> (a-map :batman)
    "Bruce Wayne"
    user> (a-map :zorro)
    nil
    user> (merge a-map {:zorro "Diego de la Vega"})
    {:superman "Clark Kent", :batman "Bruce Wayne", :zorro "Diego de la Vega"}
    user> a-map
    {:superman "Clark Kent", :batman "Bruce Wayne"}
    user> (contains? a-map :batman)
    true
    user> (assoc a-map :catwoman "Selina Kyle")
    {:superman "Clark Kent", :batman "Bruce Wayne", :catwoman "Selina Kyle"}
    user> a-map
    {:superman "Clark Kent", :batman "Bruce Wayne"}
    user> (dissoc a-map :batman)
    {:superman "Clark Kent"}
    user> a-map
    {:superman "Clark Kent", :batman "Bruce Wayne"}

Saturday, November 3, 12
亠从仂
                           (Vector)


Saturday, November 3, 12
user> (vector 1 2 3 4)
                           [1 2 3 4]
                           user> (into [] '(1 2 3 4))
                           [1 2 3 4]
                           user> (def v (into [] (range 1 5)))
                           #'user/v
                           user> (count v)
                           4
                           user> (nth v 0)
                           1
                           user> (conj v 5)
                           [1 2 3 4 5]
                           user> (pop v)
                           [1 2 3]
                           user> (peek v)
                           4
                           user> [1 2 3 4]
                           [1 2 3 4]


Saturday, November 3, 12
Seq API



Saturday, November 3, 12
亟亠仆亳仆仂 亳
                             仂礌亳亠


Saturday, November 3, 12
舒舒仍亠仍仆仂
                           仗仂亞舒仄亳舒仆亠




Saturday, November 3, 12
舒从仂仆 仆舒  亟舒亟亠
                        亳舒 于 仗仂仍亠亟仆亳亠
                             亞仂亟亳仆亳


Saturday, November 3, 12
仂亠仂亳亠 亟仆亠 舒
                    仄舒仂于仂 仄仆仂亞仂磲亠仆亳.


Saturday, November 3, 12
仂亞舒仄亳亳亠 亟仆亠
                   仗亳舒 仄舒仂于仂 single-
                threaded(process) 仂亠!



Saturday, November 3, 12
舒仂 舒从舒 弍亠, ミ出委亳?
Saturday, November 3, 12
仂亞舒仄亳亳亠 舒 亳亟亳仂亳!
Saturday, November 3, 12
弌仍仂亢仆仂 仗舒舒仍亠仍仆仂仂
                             仗仂亞舒仄亳舒仆亠 亠!
Saturday, November 3, 12
于亳 仗从亳



Saturday, November 3, 12
user> (def f (future (Thread/sleep 10000) (println "done") 100))
    #'user/f
    user> f
    #<core$future_call$reify__5684@201075c5: :pending>
    user> @f
    done

    100
    user> @f
    100
    user> (def my-delay (delay (println "did some work") 100))
    #'user/my-delay
    user> @my-delay
    did some work
    100
    user> @my-delay
    100



Saturday, November 3, 12
舒舒仍亠仍仆亳 仂仗亠舒亳亳
                        于 从仂仍亠从亳亳


Saturday, November 3, 12
user> (defn slow-op [n] (Thread/sleep 5000) n)
    #'user/slow-op
    user> (map slow-op (range 1 5))
    (1 2 3 4)
    user> (time (doall (map slow-op (range 1 5))))
    "Elapsed time: 20004.081 msecs"
    (1 2 3 4)
    user> (time (doall (pmap slow-op (range 1 5))))
    "Elapsed time: 5002.705 msecs"
    (1 2 3 4)




Saturday, November 3, 12
Refs



Saturday, November 3, 12
(def picked-numbers (ref #{}))

   (def secret-num (.nextInt (java.util.Random.) 10))

   (defn guess-number [n]
     (print "Enter a guess between 1 and 10: ")
     (flush)
     (let [guess (java.lang.Integer/parseInt (read-line)) ]
       (cond
        (= guess n) (println "You guessed correctly")
        (contains? (deref picked-numbers) n) (println "Pick
   another number!")
        :else (dosync
               (alter picked-numbers conj guess)))))




Saturday, November 3, 12
user> (guess-number secret-num)
                           Enter a guess between 1 and 10:   1
                           #{1}
                           user> (guess-number secret-num)
                           Enter a guess between 1 and 10:   2
                           #{1 2}
                           user> (guess-number secret-num)
                           Enter a guess between 1 and 10:   3
                           #{1 2 3}
                           ...
                           user> (guess-number secret-num)
                           Enter a guess between 1 and 10:   7
                           #{1 2 3 4 5 6 7}
                           user> (guess-number secret-num)
                           Enter a guess between 1 and 10:   8
                           #{1 2 3 4 5 6 7 8}
                           user> (guess-number secret-num)
                           Enter a guess between 1 and 10:   9
                           You guessed correctly

Saturday, November 3, 12
Atoms




Saturday, November 3, 12
(def picked-numbers (atom #{}))

   (def secret-num (.nextInt (java.util.Random.) 10))

   (defn guess-number [n]
     (print "Enter a guess between 1 and 10: ")
     (flush)
     (let [guess (java.lang.Integer/parseInt (read-line)) ]
       (cond
        (= guess n) (println "You guessed correctly")
        (contains? (deref picked-numbers) n) (println "Pick
   another number!")
        :else (swap! picked-numbers conj guess))))




Saturday, November 3, 12
Agents



Saturday, November 3, 12
user> (def some-agent (agent 0))
          #'user/some-agent
          user> (dotimes [i 100] (send some-agent inc))
          nil
          user> some-agent
          #<Agent@1997c457: 100>
          user> @some-agent
          100

Saturday, November 3, 12
Time is the new memory.
Saturday, November 3, 12
于亳 亟仂弍亠, 舒仄舒 亟舒仍亳
                  亠  弍亟亠 舒 舒弍仂舒?
                     仂弍亳 仗仂亞舒仄亳亳 亠 亳亰仆舒 仆舒 舒仍舒亰亳
                           从仄 Clojure
                     OReilly 亳亰亟舒亟仂舒 从仆亳亞舒 亰舒 Clojure!!!
                     Thoughtbot 于亠于舒 从仂仄仗舒仆亳亳亠 亟舒
                           亰舒仍舒亞舒 仆舒 Clojure



Saturday, November 3, 12
仆仄亠仆亳 亰舒
                           仄舒仂于仂 舒亰亠仆亳亠
                     Leiningen 2
                     Emacs
                     clojure-mode
                     paredit
                     nrepl.el

Saturday, November 3, 12
Emacs Prelude 于从仍ム于舒 于亳从仂, 从仂亠仂
                 于亳 磡于舒 亟舒 仗仂亞舒仄亳舒亠 仆舒 Clojure

                           https://github.com/bbatsov/prelude




Saturday, November 3, 12
仂亳于仂舒仆从仂于舒
                             舒亳仍亠亳

                     Eclipse (CounterClockWise)
                     IntelliJ IDEA (LaClojure)
                     NetBeans (Enclojure)


Saturday, November 3, 12
http://clojurekoans.org
Saturday, November 3, 12
仍亠仆舒亳于亳亠




Saturday, November 3, 12
Simplicity is the
                   ultimate sophistication.
                                 Leonardo Da Vinci



Saturday, November 3, 12
仂仆亠



Saturday, November 3, 12
仗仂亳?



Saturday, November 3, 12

More Related Content

Clojure: Return of the Jedi

  • 1. Episode VI: Clojure 舒于舒仆亠仂 仆舒 亢亠亟舒亳亠 Saturday, November 3, 12
  • 3. bozhidar user> (:twitter bozhidar) "@bbatsov" user> (bozhidar :blog) "http://batsov.com" user> (:github bozhidar) "http://github.com/bbatsov" Saturday, November 3, 12
  • 10. 舒仂 仄 从? Saturday, November 3, 12
  • 12. 舒仆舒仍亳 仄亠 亟仂 亳 于 从舒仍舒 仆舒亠亠仆舒 亳仆亳亟亠仆仆舒 仍仂亢仆仂 亳 于仂弍亠 仆亠 亳 亟舒于舒仄亠 仄亠从舒 亰舒 仂于舒... Saturday, November 3, 12
  • 13. public boolean hasUpperCase(String word) { if (word == null) { return false; } int len = word.length(); for (int i = 0; i < len; i++) { if (Character.isUpperCase(word.charAt(i))) { return true; } } return false; } (defn has-uppercase? [string] (some #(Character/isUpperCase %) string)) Saturday, November 3, 12
  • 14. 仂于仂仂 亠 亟仂弍亠 亰舒弍舒于亠仆仂 舒仂. Saturday, November 3, 12
  • 15. 仂仆于亠仆亳仂仆舒仍亠仆 亠亰亳从 亰舒 仗仂亞舒仄亳舒仆亠 Saturday, November 3, 12
  • 16. 丼亳舒于 亠亰亳从 亰舒 仗仂亞舒仄亳舒仆亠 Saturday, November 3, 12
  • 17. 个仆从亳仂仆舒仍亠仆 亠亰亳从 亰舒 仗仂亞舒仄亳舒仆亠 Saturday, November 3, 12
  • 22. 舒亞亳舒 仆舒 Lisp 仂仍仂于亳仆 于亠从仂于仆舒 亳仂亳 丼亠仂 亳仄亳亳舒仆, 于亠仆仂 仆亠仆舒亟仄亳仆舒 亰从仍ム亳亠仍仆仂 仄舒仍从仂 磲仂 仂亳 仆亳从舒从于 亳仆舒从亳 仂亟 亠 亟舒仆仆亳 (code is data) 仆亠舒从亳于仆仂 仗仂亞舒仄亳舒仆亠 Saturday, November 3, 12
  • 23. 仂弍仍亠仄亳亠 仆舒 Lisp (Common Lisp/Scheme) 亳从舒从于舒 亳仆仂于舒亳 仍亠亟 舒仆亟舒亳亰亳舒仆亠仂 亳仄 弌亠亞仄亠仆舒亳 仄舒舒 亠亟仆仂于亠仄亠仆仆仂 (concurrently) 仆亠 亠 仗仂仄亠仆舒于舒 于 仗亠亳亳从舒亳亳亠 亳仄 仂于亠亠仂 Lisp-仂于亠 亟亠亳仆亳舒 舒仄亳 于仂舒 仗仍舒仂仄舒 Saturday, November 3, 12
  • 24. 亳仆从亳亠 仄亢亠 仆亠 亞亳 亠 舒 仂 仄舒仍从仂 从仂弍亳! Saturday, November 3, 12
  • 25. 丱仂舒舒 亳仄舒 仆亠仗亳仆亳 仆舒于亳从 亟舒 弍从舒 亟仄亳亠 仗仂亰仆舒仂 亳 亳仆亳亳于仆仂. Saturday, November 3, 12
  • 26. "We were after the C++ programmers. We managed to drag a lot of them about halfway to Lisp." Saturday, November 3, 12
  • 27. Ruby was a Lisp originally, in theory. Ruby was a Lisp originally, in theory. Saturday, November 3, 12
  • 28. 仂仍礆舒 舒 仂 亠亰亳亳亠, 从仂亳仂 舒于舒 亰舒 仆亠仂 舒 仗仂于仍亳礌亳 仗磻仂 亳仍亳 从仂于亠仆仂 仂 Lisp!!! Saturday, November 3, 12
  • 30. A language that doesnt affect the way you think about programming is not worth knowing. Saturday, November 3, 12
  • 32. 亠仆亳舒 亳仆舒仄亳亠仆 亠亰亳从 亰舒 仗仂亞舒仄亳舒仆亠 JVM/CLR/JavaScript 仂亟亠亠仆 亟亳舒仍亠舒从 仆舒 Lisp (1) 个仆从亳仂仆舒仍亠仆 仗仂 仗舒从亳亠仆 仆舒亳仆 仗亳仄亳亰亳舒仆 亰舒 仗舒舒仍亠仍仆仂 仗仂亞舒仄亳舒仆亠 仂亠 亰舒 亠亟亳仆 仗仂-仗仂 于 Saturday, November 3, 12
  • 33. 于仂仍ム亳舒 仆舒 Lisp 弍仂亞仂仄 car & cdr (hello 鍖rst & rest) 仗仂-仄舒仍从仂 从仂弍亳 仗仂于亠亠 从亳 仂 亟舒仆仆亳 literal 亳仆舒从亳 (set, map, vector) 从仂于舒仆仂 弍亰 runtime 舒仆亟舒亳亰亳舒仆 runtime 仆亠仗仂仄亠仆亳仄亳 (immutable) 从亳 亟舒仆仆亳 Saturday, November 3, 12
  • 34. (hello clojure) (defn hello-world [] (println "Hello, world!")) (defn hello [name] (println (format "Hello, %s!" name))) Saturday, November 3, 12
  • 35. user> (hello-world) Hello, world! nil user> (hello "Bozhidar") Hello, Bozhidar! nil Saturday, November 3, 12
  • 36. Lisp programmers know the value of everything, but the cost of nothing. Saturday, November 3, 12
  • 37. 弌从亳 仂 亟舒仆仆亳 于亰舒仆 仗亳从 (list) 仄仆仂亢亠于仂 (set) 于亠从仂 舒仂亳舒亳于亠仆 仄舒亳于 (map/dictionary) 于亳从仂 亢舒于亠从仂 亳 仂亟仆仂 Saturday, November 3, 12
  • 39. user> (list 1 2 3) (1 2 3) user> '(1 2 3) (1 2 3) user> (def names '("Bozhidar" "Snezhi" "Batman" "Yoda" "Mike")) #'user/names user> (first names) "Bozhidar" user> (rest names) ("Snezhi" "Batman" "Yoda" "Mike") user> (last names) "Mike" user> (count names) 5 user> (map lower-case names) ("bozhidar" "snezhi" "batman" "yoda" "mike") user> (map count names) (8 6 6 4 4) user> (apply + (map count names)) 28 user> (cons "Pesho" names) ("Pesho" "Bozhidar" "Snezhi" "Batman" "Yoda" "Mike") user> names ("Bozhidar" "Snezhi" "Batman" "Yoda" "Mike") user> (conj names "Pesho") ("Pesho" "Bozhidar" "Snezhi" "Batman" "Yoda" "Mike") Saturday, November 3, 12
  • 40. Mutable state is the new spaghetti code. Saturday, November 3, 12
  • 41. user> (filter even? (range 1 10)) (2 4 6 8) user> (every? even? (range 1 10)) false user> (every? even? (filter even? (range 1 10))) true user> (map #(+ % 5) (range 1 10)) (6 7 8 9 10 11 12 13 14) user> (map (partial + 5) (range 1 10)) (6 7 8 9 10 11 12 13 14) user> (map (comp (partial * 2) (partial + 5)) (range 1 10)) (12 14 16 18 20 22 24 26 28) Saturday, November 3, 12
  • 42. user> (doc and) ------------------------- clojure.core/and ([] [x] [x & next]) Macro Evaluates exprs one at a time, from left to right. If a form returns logical false (nil or false), and returns that value and doesn't evaluate any of the other expressions, otherwise it returns the value of the last expr. (and) returns true. nil user> (source and) (defmacro and "Evaluates exprs one at a time, from left to right. If a form returns logical false (nil or false), and returns that value and doesn't evaluate any of the other expressions, otherwise it returns the value of the last expr. (and) returns true." {:added "1.0"} ([] true) ([x] x) ([x & next] `(let [and# ~x] (if and# (and ~@next) and#)))) nil Saturday, November 3, 12
  • 43. 仆仂亢亠于仂 (Set) Saturday, November 3, 12
  • 44. user> (set '(1 1 2 2 3 3)) #{1 2 3} user> (def a-set #{1 2 3 4 5}) #'user/a-set user> (contains? a-set 3) true user> (contains? a-set 9) false user> (conj a-set 5) #{1 2 3 4 5} user> (conj a-set 6) #{1 2 3 4 5 6} user> (use 'clojure.set) nil user> (intersection #{1 2 3} #{2 3 4}) #{2 3} user> (difference #{1 2 3} #{2 3 4}) #{1} user> (union #{1 2 3} #{2 3 4}) #{1 2 3 4} Saturday, November 3, 12
  • 45. 仂亳舒亳于亠仆 仄舒亳于 (Map) Saturday, November 3, 12
  • 46. user> (hash-map 1 2 3 4) {1 2, 3 4} user> (hash-map "Batman" "Bruce Wayne" "Superman" "Clark Kent") {"Batman" "Bruce Wayne", "Superman" "Clark Kent"} user> {:batman "Bruce Wayne", :superman "Clark Kent"} {:superman "Clark Kent", :batman "Bruce Wayne"} user> (def a-map {:batman "Bruce Wayne", :superman "Clark Kent"}) #'user/a-map user> (:superman a-map) "Clark Kent" user> (a-map :batman) "Bruce Wayne" user> (a-map :zorro) nil user> (merge a-map {:zorro "Diego de la Vega"}) {:superman "Clark Kent", :batman "Bruce Wayne", :zorro "Diego de la Vega"} user> a-map {:superman "Clark Kent", :batman "Bruce Wayne"} user> (contains? a-map :batman) true user> (assoc a-map :catwoman "Selina Kyle") {:superman "Clark Kent", :batman "Bruce Wayne", :catwoman "Selina Kyle"} user> a-map {:superman "Clark Kent", :batman "Bruce Wayne"} user> (dissoc a-map :batman) {:superman "Clark Kent"} user> a-map {:superman "Clark Kent", :batman "Bruce Wayne"} Saturday, November 3, 12
  • 47. 亠从仂 (Vector) Saturday, November 3, 12
  • 48. user> (vector 1 2 3 4) [1 2 3 4] user> (into [] '(1 2 3 4)) [1 2 3 4] user> (def v (into [] (range 1 5))) #'user/v user> (count v) 4 user> (nth v 0) 1 user> (conj v 5) [1 2 3 4 5] user> (pop v) [1 2 3] user> (peek v) 4 user> [1 2 3 4] [1 2 3 4] Saturday, November 3, 12
  • 50. 亟亠仆亳仆仂 亳 仂礌亳亠 Saturday, November 3, 12
  • 51. 舒舒仍亠仍仆仂 仗仂亞舒仄亳舒仆亠 Saturday, November 3, 12
  • 52. 舒从仂仆 仆舒 亟舒亟亠 亳舒 于 仗仂仍亠亟仆亳亠 亞仂亟亳仆亳 Saturday, November 3, 12
  • 53. 仂亠仂亳亠 亟仆亠 舒 仄舒仂于仂 仄仆仂亞仂磲亠仆亳. Saturday, November 3, 12
  • 54. 仂亞舒仄亳亳亠 亟仆亠 仗亳舒 仄舒仂于仂 single- threaded(process) 仂亠! Saturday, November 3, 12
  • 55. 舒仂 舒从舒 弍亠, ミ出委亳? Saturday, November 3, 12
  • 57. 弌仍仂亢仆仂 仗舒舒仍亠仍仆仂仂 仗仂亞舒仄亳舒仆亠 亠! Saturday, November 3, 12
  • 59. user> (def f (future (Thread/sleep 10000) (println "done") 100)) #'user/f user> f #<core$future_call$reify__5684@201075c5: :pending> user> @f done 100 user> @f 100 user> (def my-delay (delay (println "did some work") 100)) #'user/my-delay user> @my-delay did some work 100 user> @my-delay 100 Saturday, November 3, 12
  • 60. 舒舒仍亠仍仆亳 仂仗亠舒亳亳 于 从仂仍亠从亳亳 Saturday, November 3, 12
  • 61. user> (defn slow-op [n] (Thread/sleep 5000) n) #'user/slow-op user> (map slow-op (range 1 5)) (1 2 3 4) user> (time (doall (map slow-op (range 1 5)))) "Elapsed time: 20004.081 msecs" (1 2 3 4) user> (time (doall (pmap slow-op (range 1 5)))) "Elapsed time: 5002.705 msecs" (1 2 3 4) Saturday, November 3, 12
  • 63. (def picked-numbers (ref #{})) (def secret-num (.nextInt (java.util.Random.) 10)) (defn guess-number [n] (print "Enter a guess between 1 and 10: ") (flush) (let [guess (java.lang.Integer/parseInt (read-line)) ] (cond (= guess n) (println "You guessed correctly") (contains? (deref picked-numbers) n) (println "Pick another number!") :else (dosync (alter picked-numbers conj guess))))) Saturday, November 3, 12
  • 64. user> (guess-number secret-num) Enter a guess between 1 and 10: 1 #{1} user> (guess-number secret-num) Enter a guess between 1 and 10: 2 #{1 2} user> (guess-number secret-num) Enter a guess between 1 and 10: 3 #{1 2 3} ... user> (guess-number secret-num) Enter a guess between 1 and 10: 7 #{1 2 3 4 5 6 7} user> (guess-number secret-num) Enter a guess between 1 and 10: 8 #{1 2 3 4 5 6 7 8} user> (guess-number secret-num) Enter a guess between 1 and 10: 9 You guessed correctly Saturday, November 3, 12
  • 66. (def picked-numbers (atom #{})) (def secret-num (.nextInt (java.util.Random.) 10)) (defn guess-number [n] (print "Enter a guess between 1 and 10: ") (flush) (let [guess (java.lang.Integer/parseInt (read-line)) ] (cond (= guess n) (println "You guessed correctly") (contains? (deref picked-numbers) n) (println "Pick another number!") :else (swap! picked-numbers conj guess)))) Saturday, November 3, 12
  • 68. user> (def some-agent (agent 0)) #'user/some-agent user> (dotimes [i 100] (send some-agent inc)) nil user> some-agent #<Agent@1997c457: 100> user> @some-agent 100 Saturday, November 3, 12
  • 69. Time is the new memory. Saturday, November 3, 12
  • 70. 于亳 亟仂弍亠, 舒仄舒 亟舒仍亳 亠 弍亟亠 舒 舒弍仂舒? 仂弍亳 仗仂亞舒仄亳亳 亠 亳亰仆舒 仆舒 舒仍舒亰亳 从仄 Clojure OReilly 亳亰亟舒亟仂舒 从仆亳亞舒 亰舒 Clojure!!! Thoughtbot 于亠于舒 从仂仄仗舒仆亳亳亠 亟舒 亰舒仍舒亞舒 仆舒 Clojure Saturday, November 3, 12
  • 71. 仆仄亠仆亳 亰舒 仄舒仂于仂 舒亰亠仆亳亠 Leiningen 2 Emacs clojure-mode paredit nrepl.el Saturday, November 3, 12
  • 72. Emacs Prelude 于从仍ム于舒 于亳从仂, 从仂亠仂 于亳 磡于舒 亟舒 仗仂亞舒仄亳舒亠 仆舒 Clojure https://github.com/bbatsov/prelude Saturday, November 3, 12
  • 73. 仂亳于仂舒仆从仂于舒 舒亳仍亠亳 Eclipse (CounterClockWise) IntelliJ IDEA (LaClojure) NetBeans (Enclojure) Saturday, November 3, 12
  • 76. Simplicity is the ultimate sophistication. Leonardo Da Vinci Saturday, November 3, 12