Avram Aelony presented this talk in SBJUG on September 27 2012.
To introduce Clojure as a powerful JVM language and look at Clojure from a value-added perspective for those that already know Java.
The recorded talk can be found at - http://www.youtube.com/watch?v=HhMCX8xwjo8
The Ultimate Guide to Choosing WordPress Pros and Cons
I know Java, why should I consider Clojure?
1. Introducing Clojure as a powerful JVM language
from a value-added perspective for those that
already know Java.
a.k.a.
“Okay, I know Java, why should I consider
Clojure?”
2. A little about me
● Avram Aelony
● My programming language evolution
● Notes about evangelism
● use the language you prefer “whenever,
wherever...” like Shakira says
● How I came to Clojure
3. Disclaimers
● Standing on the shoulders of giants, luminaries
● This is a HUGE topic
● The Good news:
● There are MUCH better (explained, comprehensive,
deeper) talks on this topic than mine
● I will reference them
● Should you remain unconvinced by this talk, there
are inumerable resources online that may be
somewhat more convincing
4. Audience survey
● Java ?
● Clojure ?
● Other functional language?
● Other JVM language?
5. Utility
● Why is Clojure useful if you know Java?
● It adds to what you know
● Provides simplicity, concision, more
l
6. Grand tour
● Idea is to go into the Rationale and introduce Clojure
along the way
● Mostly about the Why rather than the How
● ... some How as well...
8. Rationale
"I wanted: A Lisp for Functional Programming
symbiotic with an established Platform
designed for Concurrency."
●
- Rich Hickey, creator of Clojure
http://clojure.org/rationale
9. Break down
1. A Lisp
2. for Functional Programming
3. symbiotic with an established platform
4. designed for Concurrency
10. Break down
1. A Lisp
2. for Functional Programming
3. symbiotic with an established platform
4. designed for Concurrency
11. A Lisp
● Dynamic typing
● Homoiconic: Uniform, elegant syntax
● Expression oriented: Symbolic expressions
● Lambda calculus: variable binding
● Macros
● Code as data
● Data as code
12. Clojure Data Structures
● Lists '( 1 2 3 4 )
● new insertions go to the front
● Vectors [ 1 2 3 4 ]
● new insertions go to the back
● Maps { :a 1 :b 2 :c 3 :d 4}
● Sets #{ :a :b :c :d }
● implemented as k/v where k=v.
15. Immutable Data
● So how can things change?
● New things can be created
● Underlying structure is shared wherever possible
● only connections change
16. Immutable Data + Structural Sharing
identical?
function that
returns true only
when symbols are
in fact the same
object.
Phillip Potter http://skillsmatter.com/podcast/scala/persistent-data-structures-in-clojure
17. Collections Abstraction
● Vectors, Maps, Sets can be thought of as Collections.
● Most functions that work on one data structure will
work on any other.
● Easy to change from Vector to Map to Set with minimal
refactoring of functions.
18. Sequences and Collections
● seqs are persistent and immutable
● seq function
● lazyiness, lazy application
● seq interface
22. Fizz Buzz
Print the numbers from 1 to N
If a number is divisible by 3, print "Fizz" instead
If a number is divisible by 5, print "Buzz" instead
If a number is divisible by 3 and 5, print "FizzBuzz" instead
25. S-Expressions, data as code
● John McCarthy
● assign symbolic names to clojure data
● trees of expressions, each of which returns a
value
● functions can be assigned to vars
● def, fn, defn
http://en.wikipedia.org/wiki/Symbolic_expression
26. Macros
● Why Macros?
● to arrange code differently
– Threading macros -> and ->>
– infix versus postfix
– dot and dot dot macros for Java interop
● to remove or reduce boilerplate code
27. “The whole language is always available. There is no real distinction
between read-time, compile-time, and runtime. You can compile or run code
while reading, read or run code while compiling, and read or compile code at
runtime.”
“Running code at read-time lets users reprogram Lisp's syntax; running code
at compile-time is the basis of macros; compiling at runtime is the basis of
Lisp's use as an extension language in programs like Emacs; and reading at
runtime enables programs to communicate using s-expressions, an idea
recently reinvented as XML. “
What Made Lisp Different
http://www.paulgraham.com/diff.htm
28. Compilation
● “Clojure compiles all code you load on-the-fly
into JVM bytecode, but sometimes it is
advantageous to compile ahead-of-time (AOT).”
http://clojure.org/compilation
31. Break down
1. A Lisp
2. for Functional Programming
3. symbiotic with an established platform
4. designed for Concurrency
32. Functional Programming
● tools to avoid mutable state, data
● referential transparency
● functions are first class objects
● emphasizes application of functions
● emphasizes recursive iteration
● encourages higher-order functions
http://clojure.org/functional_programming
http://en.wikipedia.org/wiki/Functional_programming
http://en.wikipedia.org/wiki/Referential_transparency_%28computer_science%29
33. Referential Transparency
● expressions can be replaced with their value without
changing the behavior of the program
● easier to reason about programs
“... can help in proving correctness,
simplifying an algorithm,
assisting in modifying code without breaking it,
or optimizing code by means of memoization,
common subexpression elimination or parallelization.”
-wikipedia
http://en.wikipedia.org/wiki/Referential_transparency_%28computer_science%29
34. Higher Order Functions
map is an example of a higher order function, since it
applies another function to a collection.
juxt is a higher order function that juxtaposes the values
that result from the application of one or more functions.
35.
36. Not exactly what we want without
map
Higher order functions allow for great flexibility in re-shaping data.
37. Break down
1. A Lisp
2. for Functional Programming
3. symbiotic with an established platform
4. designed for Concurrency
38. JVM as host platform
● Interop as built-in syntax
● Java libraries easily used from Clojure
● e.g. Hadoop, Apache libraries, anything in a
Maven repo, etc..
39. Java Interop
Clojure Java
Constructor (Widget. “foo”) new Widget(“foo”)
Instance members (.nextInt rnd) rnd.nextInt()
chaining access (.. person getAddress getZipCode) person.getAddress().getZipCode()
(.getZipCode (.getAddress (person.)))
static member access Math/PI Math.PI
41. Break down
1. A Lisp
2. for Functional Programming
3. symbiotic with an established platform
4. designed for Concurrency
42. Designed for Concurrency
● “I don't usually share State, but when I do...”
● Must explicitly use special symbols, functions to
share mutable State.
● Easier to use concurrency safely in Clojure
43. Designed for Concurrency
● Asynchronous - the request to update is queued to happen in
another thread sometime later. The thread that made the request
can continue immediately.
● Coordinated - reads and writes to multiple refs can be made in a
way that guarantees no race conditions.
● Retriable - work is speculative and may have to be repeated.
44. Concurrency vs Parallelism
● Parallelism -
partitioning of one task into multiple parts, each that
run at the same time
● Concurrency -
execution of disparate tasks at roughly the same
time, sharing a common resource
45. mutation a la carte
● Available are
Shared? Asynchronous? Coordinated? Retriable?
Refs yes no yes yes
Agents yes yes no no
Atoms yes no no yes
46. Transactions
● Software Transactional Memory (STM)
● (dosync ... )
● STM uses Multiversion Concurrency Control
– marks the old data as obsolete and adds the newer
version
– http://en.wikipedia.org/wiki/Multiversion_concurrency_control
47. Refs
● mutable references to objects
● can only be changed within a transaction (TX)
● (dosync ...)
● no locks. no chance of a deadlock.
● MVCC ensures snapshot isolation, each TX gets its
own view of the data it is interested in.
● each TX is oblivious to other TX's.
● all ref modifications succeed or none do
● If TX2 commits a change while TX1 is working, it may
cause TX1 to be retried.
48. Refs
commute
This fn should be commutative, or, failing that, you must accept last-one-in-wins
behavior. commute allows for more concurrency than ref-set.
58. IDE's and editors
● Any editor with syntax highlighting will do
● Your favorite Java IDE likely has a Clojure
plugin
● What do most folks use?
59. 1,372 responses were received over 7 days.
Anounced via Twitter & Clojure mailing list
(~6700 recipients)
http://cemerick.com/2012/08/06/results-of-the-2012-state-of-clojure-survey/
60.
61. That was a whirlwind grand tour...
Thanks for listening!
(def email {:name “aaelony” :domain “@gmail.com”})