clojure presentation

Download Clojure presentation

If you can't read please download the document

Upload: tikal-knowledge

Post on 27-May-2015

74 views

Category:

Documents


1 download

TRANSCRIPT

  • 1. Clojure LISP on the JVM Dynamic Started in 2007 by Rich Hickey 3 years of planning Current version - 1.6.0 Eclipse license

2. Defining Features LISP syntax but not Common LISP or Scheme Macros Immutability Functional JVM based Java interop Not OOP Supports Concurrency 3. Syntax Numbers: 1234, 1.234, 1.234M Ratios: 22/7 Strings: foo, bar, Characters: a b c Symbols: foo, bar, Keywords: :foo, :bar Boolean: true, false, Null: nil Regex Patterns: #a*b 4. Data Structures Lists singly linked, grow at front: (1 2 3 4) Vectors indexed, grow at end: [1 2 3 4] Maps key/value associations: {:a 1 :b 2 :c 3} Sets: #{:a :b :c} Everything nests inside each other 5. Syntax That's the entire syntax Data strcuture are the code (Homoiconicity) All data literals stand for themselves except: Lists (IFn invocation) Symbols (pointers) 6. Lists as Invocations Example (+ 1 1) => 2 (+ 1 2 (+ 3 4 5)) => 15 (first [:a :b :c]) => :a (rest [:a :b :c]) => (:b :c) (class foo) => java.lang.String (class 1) => java.long.Long 7. Persistent Data Structures All Clojure data structures are persistent Collections maintain performance guarantees: New + Old version of collections are available after change New versions are not full copies Thread safe, iteration safe Sequences replace traditional lists All Clojure and Java collections can be made into seqs 8. Persistent Data Structure Performance O(log32 N) ~= O(1) A B C D E F G H I J K L M N' A C G N 9. Seq General Macros All seqs, which means all lists, vectors, hash- maps, hash-sets, strings etc. can use the multi purpose seq macros. A kind of polymorphism over collections. (def xs [:a :b :c]) (first xs) => :a , (rest xs) => (:b :c) (count xs) => 3 , (contains? xs :d) => false (remove #(= % :b) xs) => (:a :c) (nth xs 2) => :c 10. Laziness Seqs can be lazy (repeat :a) => (:a :a :a :a :a ) Processing is delayed until the seq is realized: (class (repeat :a)) => clojure.lang.LazySeq Realize part of a lazy seq: (take 3 (repeat :a)) => (:a :a :a) 11. Philosophy Use libraries instead of frameworks REPL first development Small and isolated functions Data structures instead of classes 12. DEMO 13. Java Interop (.toLowerCase AppsFlyer) => appsflyer (. [ ]) (Foo. bar) => # (. [...]) (Integer/parseInt 5) => 5 (/ [...]) (.contains AppsFlyer FTW FTW) => true 14. Concurrency Clojure uses STM no locks in the code Multiversion Concurrency Control (MVCC) Readers never impede writers and writers never impeded readers 3 primitive containers to store mutable data atom, ref, agent Refs coordinated-sync access to many identities Atoms Uncoordinated-sync access to a single identity Agents Uncoordinated-async access to a single identity 15. So Much More... Metadata Optimized tail recursion Destructuring binding in let/fn/loop List comprehensions Multimethods Parallel computations Macros