• Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
6,466
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
233
Comments
0
Likes
10

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Clojure A Dynamic Programming Language for the JVM An Introduction for Java Programmers Rich Hickey
  • 2. Introduction • Who are you? • Know/use Lisp? • Java/C#/Scala? • ML/Haskell? • Python, Ruby, Groovy? • Clojure? • Any multithreaded programming?
  • 3. Agenda • Fundamentals • Syntax and evaluation model • Sequences • Java Integration • Concurrency • Q&A
  • 4. Clojure Fundamentals • Dynamic • a new Lisp, not Common Lisp or Scheme • Functional • emphasis on immutability • Hosted on the JVM • Supporting Concurrency • Open Source
  • 5. Why use a dynamic language? • Flexibility • Interactivity • Concision • Exploration • Focus on your problem
  • 6. Which dynamic language? • Many options on the JVM • allow you to leverage your existing knowledge and code • Ports to JVM • JRuby • Jython • Native to JVM • Groovy • Clojure
  • 7. Why Clojure? • Expressive, elegant • Good performance • Useful for the same tasks Java is • Wrapper-free Java access • Powerful extensibility • Functional programming and concurrency
  • 8. Clojure is a Lisp • Dynamic • Code as data • Reader • Small core • Sequences • Syntactic abstraction
  • 9. Dynamic development • REPL - Read-eval-print-loop • Define functions on the fly • Load and compile code at runtime • Introspection • Interactive environment
  • 10. Atomic Data Types • Arbitrary precision integers -12345678987654 • Doubles , BigDecimals 1.234 1.234M • Ratios -22/7 • Strings -“fred”, Characters -a b c • Symbols - fred ethel , Keywords - :fred :ethel • Booleans - true false , Null - nil • Regex patterns #“a*b”
  • 11. Data Structures • Lists - singly linked, grow at front • (1 2 3 4 5), (fred ethel lucy), (list 1 2 3) • Vectors - indexed access, grow at end • [1 2 3 4 5], [fred ethel lucy] • Maps - key/value associations • {:a 1, :b 2, :c 3}, {1 “ethel” 2 “fred”} • Sets #{fred ethel lucy} • Everything Nests
  • 12. Syntax • You’ve just seen it • Data structures are the code • Homoiconicity • No more text-based syntax • Actually, syntax is in the interpretation of data structures
  • 13. Traditional evaluation Code Text characters Effect Compiler bytecode Executable JVM .class/.jar Run java
  • 14. Clojure Evaluation Code Text characters Effect Reader data structures evaluator/ bytecode JVM compiler
  • 15. Interactivity Code Text characters Effect Reader data structures characters evaluator/ bytecode JVM compiler You
  • 16. Programs writing Programs Code Text characters Effect Reader data structures characters evaluator/ bytecode JVM compiler data structures You Program
  • 17. Syntactic Abstraction Code Text characters Effect Reader data structures characters evaluator/ bytecode JVM compiler data structures You Program data structures Program (macro)
  • 18. Expressions • Everything is an expression • All data literals represent themselves • Except: • Symbols • looks for binding to value, locally, then globally • Lists • An operation form
  • 19. Operation forms • (op ...) • op can be either: • one of very few special ops • macro • expression which yields a function
  • 20. Special ops • Can have non-normal evaluation of arguments • (def name value-expr) • establishes a global variable • (if test-expr then-expr else-expr) • conditional, evaluates only one of then/ else • fn let loop recur do new . throw try set! quote var
  • 21. Macros • Supplied with Clojure, and defined by user • Argument forms are passed as data to the macro function, which returns a new data structure as a replacement for the macro call • (or x y) (let [or__158 x] • becomes: (if or__158 or__158 y)) • Many things that are ‘built-in’ to other languages are just macros in Clojure
  • 22. Functions • First-class values (def five 5) (def sqr (fn [x] (* x x))) (sqr five) 25 • Maps are functions of their keys (def m {:fred :ethel :ricky :lucy}) (m :fred) :ethel
  • 23. Syntax Summary • Things that would be declarations, control structures, function calls, operators, are all just lists with op at front: Java Clojure int i = 5; (def i 5) if(x == 0) (if (zero? x) return y; y else z) return z; x* y * z; (* x y z) foo(x, y, z); (foo x y z) foo.bar(x); (. foo bar x)
  • 24. Sequences • Abstraction of traditional Lisp lists • (seq coll) • if collection is non-empty, return seq object on it, else nil • (first seq) • returns the first element • (rest seq) • returns a seq of the rest of the elements, or nil if no more
  • 25. Sequence Library (drop 2 [1 2 3 4 5]) -> (3 4 5) (take 9 (cycle [1 2 3 4])) -> (1 2 3 4 1 2 3 4 1) (interleave [:a :b :c :d :e] [1 2 3 4 5]) -> (:a 1 :b 2 :c 3 :d 4 :e 5) (partition 3 [1 2 3 4 5 6 7 8 9]) -> ((1 2 3) (4 5 6) (7 8 9)) (map vector [:a :b :c :d :e] [1 2 3 4 5]) -> ([:a 1] [:b 2] [:c 3] [:d 4] [:e 5]) (apply str (interpose , "asdf")) -> "a,s,d,f" (reduce + (range 100)) -> 4950
  • 26. Java Interop (. Math PI) 3.141592653589793 (.. System getProperties (get "java.version")) "1.5.0_13" (new java.util.Date) Thu Jun 05 12:37:32 EDT 2008 (doto (JFrame.) (add (JLabel. "Hello World")) pack show) ;expands to: (let* [G__1837 (JFrame.)] (do (. G__1837 (add (JLabel. "Hello World"))) (. G__1837 pack) (. G__1837 show)) G__1837)
  • 27. Java Integration • Clojure strings are Java Strings, numbers are Numbers, collections implement Collection, fns implement Callable and Runnable etc. • Core abstractions, like seq, are Java interfaces • Clojure seq library works on Java Iterables, Strings and arrays. • Implement and extend Java interfaces and classes • New primitive arithmetic support equals Java’s speed.
  • 28. Swing Example (import '(javax.swing JFrame JLabel JTextField JButton) '(java.awt.event ActionListener) '(java.awt GridLayout)) (defn celsius [] (let [frame (JFrame. "Celsius Converter") temp-text (JTextField.) celsius-label (JLabel. "Celsius") convert-button (JButton. "Convert") fahrenheit-label (JLabel. "Fahrenheit")] (.addActionListener convert-button (proxy [ActionListener] [] (actionPerformed [evt] (let [c (. Double parseDouble (.getText temp-text))] (.setText fahrenheit-label (str (+ 32 (* 1.8 c)) " Fahrenheit")))))) (doto frame (setLayout (GridLayout. 2 2 3 3)) (add temp-text) (add celsius-label) (add convert-button) (add fahrenheit-label) (setSize 300 80) (setVisible true)))) (celsius)
  • 29. Functional Programming • Immutable data + first-class functions • Functions produce same output given same input, and are free of side effects • Could always be done by discipline/convention • Pure functional languages tend to strongly static types (ML, Haskell) • Not for everyone, or every task • Dynamic functional languages are rarer • Clojure, Erlang
  • 30. Why Functional Programming? • Easier to reason about • Easier to test • Essential for concurrency (IMO) • Java Concurrency in Practice - Goetz • Additional benefits for purely functional languages (static analysis, proof, program transformation), but not Clojure
  • 31. Which Functional Language? • Fewer choices on the JVM • CAL • Haskell-like, strong type system • Scala • Type system, but immutability optional • Clojure • Dynamic types, immutable data
  • 32. Persistent Data Structures • Immutable, + old version of the collection is still available after 'changes' • Collection maintains its performance guarantees for most operations • Therefore new versions are not full copies • All Clojure data structures persistent • Hash map and vector both based upon array mapped hash tries (Bagwell) • Sorted map is red-black tree
  • 33. Structural Sharing • Key to efficient ‘copies’ and therefore persistence • Everything is final so no chance of interference • Thread safe • Iteration safe
  • 34. Path Copying HashMap HashMap int count 16 int count 15 INode root INode root
  • 35. Concurrency • Interleaved/simultaneous execution • Must avoid seeing/yielding inconsistent data • The more components there are to the data, the more difficult to keep consistent • The more steps in a logical change, the more difficult to keep consistent • Opportunities for automatic parallelism • Emphasis here on coordination
  • 36. State - You’re doing it wrong • Mutable objects are the new spaghetti code • Hard to understand, test, reason about • Concurrency disaster • Terrible default architecture (Java/C#/ Python/Ruby/Groovy/CLOS...) • Doing the right thing is very difficult • Languages matter!
  • 37. Concurrency Methods • Conventional way: • Direct references to mutable objects • Lock and worry (manual/convention) • Clojure way: • Indirect references to immutable persistent data structures • Concurrency semantics for references • Automatic/enforced • No locks!
  • 38. Direct references to Mutable Objects ? ? 42 ? 6 Ensuring a consistent Object is on your head
  • 39. Indirect references to Immutable Objects "fred" "ethel" 42 17 6 Never an inconsistent Object
  • 40. Persistent ‘Edit’ "fred" "ethel" 42 17 6 "ricky" "lucy" 42 17 6
  • 41. Atomic Update "fred" "ethel" 42 17 6 "ricky" "lucy" 42 17 6
  • 42. Clojure References • The only things that mutate are references themselves, in a controlled way • 3 types of mutable references • Vars - Isolate changes within threads • Refs - Share synchronous coordinated changes between threads • Agents - Share asynchronous independent changes between threads
  • 43. Refs and Transactions • Software transactional memory system (STM) • Refs can only be changed within a transaction • All changes are Atomic and Isolated • Every change to Refs made within a transaction occurs or none do • No transaction sees the effects of any other transaction while it is running • Transactions are speculative • Will be retried automatically if conflict • Must avoid side-effects!
  • 44. Concurrency Demo • Ant colony simulation • World populated with food and ants • Ants find food, bring home, drop pheromones • Sense pheromones, food, home • Ants act independently, on multiple real threads • Model pheromone evaporation • Animated GUI • < 250 lines of Clojure
  • 45. And much more! • Metadata • Recursive functional looping • Destructuring binding in let/fn/loop • List comprehensions (for) • Relational set algebra • Multimethods • Parallel computation • Namespaces, zippers, XML ...
  • 46. Thanks for listening! http://clojure.org