SlideShare a Scribd company logo
for Java developers
Clojure
jan.kronquist@jayway.com
onsdag 25 september 13
About me
onsdag 25 september 13
About me
1986 - Basic
onsdag 25 september 13
About me
1990 - 68K assembly
1986 - Basic
onsdag 25 september 13
About me
1990 - 68K assembly1986 - Basic
1995 - OOP
onsdag 25 september 13
1997 - University
About me
1990 - 68K assembly1986 - Basic
1995 - OOP
onsdag 25 september 13
1997 - University
About me
1990 - 68K assembly1986 - Basic
2005 - IoC,Aspects, Mixins
1995 - OOP
onsdag 25 september 13
2008 - Functional 1997 - University
About me
1990 - 68K assembly1986 - Basic
2005 - IoC,Aspects, Mixins
1995 - OOP
onsdag 25 september 13
2012 - Lisp & dynamic typing
2008 - Functional
1997 - University
About me
1990 - 68K assembly1986 - Basic
2005 - IoC,Aspects, Mixins
1995 - OOP
onsdag 25 september 13
This talk is not
A comprehensive introduction to Clojure
About idiomatic Clojure
Another talk about functional programming
onsdag 25 september 13
Killer apps
onsdag 25 september 13
Killer apps
Prismatic
onsdag 25 september 13
Killer apps
Prismatic
onsdag 25 september 13
Killer apps
Prismatic
Datomic
Storm
ClojureScript
onsdag 25 september 13
What is Clojure?
Created 2007 by Rich Hickey
Lisp
Runs on JVM, CLR & JavaScript
Design for concurrency
onsdag 25 september 13
Clojure example
(defn divisible? [n d]
(== 0 (mod n d)))
(defn divides [n]
(partial divisible? n))
(declare primes)
(defn prime? [n]
(not (some (divides n) (take-while #(< % n) primes))))
(def primes (lazy-cat
[2 3 5]
(filter prime? (drop 7 (range)))))
onsdag 25 september 13
Why Clojure?
onsdag 25 september 13
Why Clojure?
Lisp - Code as data & Syntactic abstraction
onsdag 25 september 13
Why Clojure?
Lisp - Code as data & Syntactic abstraction
Functional - Declarative, Immutable
onsdag 25 september 13
Why Clojure?
Lisp - Code as data & Syntactic abstraction
Functional - Declarative, Immutable
Interactive development environment
onsdag 25 september 13
Why Clojure?
Lisp - Code as data & Syntactic abstraction
Functional - Declarative, Immutable
Interactive development environment
Great eco-system - dynamic helps compatibility
onsdag 25 september 13
Why Clojure?
Lisp - Code as data & Syntactic abstraction
Functional - Declarative, Immutable
Interactive development environment
Great eco-system - dynamic helps compatibility
Wrapper-free Java access
onsdag 25 september 13
Why Clojure?
Lisp - Code as data & Syntactic abstraction
Functional - Declarative, Immutable
Interactive development environment
Great eco-system - dynamic helps compatibility
Wrapper-free Java access
Less complexity
onsdag 25 september 13
Common complaints
onsdag 25 september 13
Common complaints
Lisp looks weird
onsdag 25 september 13
Common complaints
Dynamic typing is scary
Lisp looks weird
onsdag 25 september 13
Common complaints
Dynamic typing is scary
Lisp looks weird
Just a toy language
onsdag 25 september 13
Common complaints
Dynamic typing is scary
Lisp looks weird
Macros? Are you crazy?
Just a toy language
onsdag 25 september 13
Lispness
onsdag 25 september 13
Clojure Atomic Data Types
Arbitrary precision integers: 12345678987654
Doubles: 1.234
BigDecimals: 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"
Rich Hickey - Clojure for Java Programmers - http://www.youtube.com/watch?v=P76Vbsk_3J0
onsdag 25 september 13
JavaScript Data Structures
Arrays
[1, 2, 3] ["fred", "ethel", "lucy"]
Objects
{name: "Jan Kronquist", age: 37}
onsdag 25 september 13
Clojure Data Structures
Vectors
[1, 2, 3] ["fred", "ethel", "lucy"]
Maps
{:name "Jan Kronquist", :age 37}
move colon
onsdag 25 september 13
Clojure Data Structures
Vectors
[1 2 3] ["fred" "ethel" "lucy"]
Maps
{:name "Jan Kronquist" :age 37}
commas are whitespace!
onsdag 25 september 13
Clojure Data Structures
Vectors - indexed access
[1 2 3] ["fred" "ethel" "lucy"]
Maps
{:name "Jan Kronquist" :age 37}
Lists - singly linked
(1 2 3 4 5) (fred ethel lucy) (list 1 2 3)
Sets
#{fred ethel lucy}
onsdag 25 september 13
Demo in REPL
user=> "hello"
"hello"
user=> 5
5
user=> [1 2 3]
[1 2 3]
user=> qwe
java.lang.RuntimeException: Unable to resolve symbol: qwe
user=> (def qwe "hello world")
#'user/qwe
user=> qwe
"hello world"
onsdag 25 september 13
"Hello world")
The strangeness of Lisp
println(
onsdag 25 september 13
"Hello world")
The strangeness of Lisp
println(
onsdag 25 september 13
"Hello world")
The strangeness of Lisp
println(
(operator operand1 operand2 ...)
Determines how the list is evaluated
onsdag 25 september 13
(= (.toString (+ 1 2)) "3")
Example evaluation
(= (.toString (+ 1 2)) "3")
onsdag 25 september 13
(= (.toString (+ 1 2)) "3")
Example evaluation
onsdag 25 september 13
(= (.toString (+ 1 2)) "3")
Example evaluation
(= (.toString 3) "3")
onsdag 25 september 13
(= (.toString (+ 1 2)) "3")
Example evaluation
(= (.toString 3) "3")
(= "3" "3")
onsdag 25 september 13
(= (.toString (+ 1 2)) "3")
Example evaluation
(= (.toString 3) "3")
(= "3" "3")
true
onsdag 25 september 13
onsdag 25 september 13
int i = 5; (def i 5) OR (let [i 5] ...)
if (x > 5) {
return y;
} else {
return z;
}
(if (> x 5)
y
z)
x * y * z (* x y z)
foo(x, y, z) (foo x y z)
object.method(x, y) (.method object x y)
public String sayHello(String x) {
return "Hello " + x;
}
(defn sayHello [x]
(str "Hello " x))
onsdag 25 september 13
int i = 5; (def i 5) OR (let [i 5] ...)
if (x > 5) {
return y;
} else {
return z;
}
(if (> x 5)
y
z)
x * y * z (* x y z)
foo(x, y, z) (foo x y z)
object.method(x, y) (.method object x y)
public String sayHello(String x) {
return "Hello " + x;
}
(defn sayHello [x]
(str "Hello " x))
onsdag 25 september 13
int i = 5; (def i 5) OR (let [i 5] ...)
if (x > 5) {
return y;
} else {
return z;
}
(if (> x 5)
y
z)
x * y * z (* x y z)
foo(x, y, z) (foo x y z)
object.method(x, y) (.method object x y)
public String sayHello(String x) {
return "Hello " + x;
}
(defn sayHello [x]
(str "Hello " x))
onsdag 25 september 13
int i = 5; (def i 5) OR (let [i 5] ...)
if (x > 5) {
return y;
} else {
return z;
}
(if (> x 5)
y
z)
x * y * z (* x y z)
foo(x, y, z) (foo x y z)
object.method(x, y) (.method object x y)
public String sayHello(String x) {
return "Hello " + x;
}
(defn sayHello [x]
(str "Hello " x))
onsdag 25 september 13
int i = 5; (def i 5) OR (let [i 5] ...)
if (x > 5) {
return y;
} else {
return z;
}
(if (> x 5)
y
z)
x * y * z (* x y z)
foo(x, y, z) (foo x y z)
object.method(x, y) (.method object x y)
public String sayHello(String x) {
return "Hello " + x;
}
(defn sayHello [x]
(str "Hello " x))
onsdag 25 september 13
int i = 5; (def i 5) OR (let [i 5] ...)
if (x > 5) {
return y;
} else {
return z;
}
(if (> x 5)
y
z)
x * y * z (* x y z)
foo(x, y, z) (foo x y z)
object.method(x, y) (.method object x y)
public String sayHello(String x) {
return "Hello " + x;
}
(defn sayHello [x]
(str "Hello " x))
onsdag 25 september 13
Java Quiz
	 public static void main(String[] args) {
	 	 int bang = 1;
do while (bang>=1)
System.out.print(" bang is "+ bang);
while (bang>1);
	 }
onsdag 25 september 13
Macros
onsdag 25 september 13
Working with Java classes
(defn display [text]
(let [frame (new JFrame "MyFrame")]
(.add frame (new JLabel text))
(.setSize frame 300 200)
(.setVisible frame true)))
static void display(String text) {
	 JFrame frame = new JFrame("MyFrame");
	 frame.add(new JLabel(text));
	 frame.setSize(300, 200);
	 frame.setVisible(true);
}
onsdag 25 september 13
Working with Java classes
(defn display [text]
(let [frame (new JFrame "MyFrame")]
(.add frame (new JLabel text))
(.setSize frame 300 200)
(.setVisible frame true)))
static void display(String text) {
	 JFrame frame = new JFrame("MyFrame");
	 frame.add(new JLabel(text));
	 frame.setSize(300, 200);
	 frame.setVisible(true);
}
(display "Hello World")
onsdag 25 september 13
Working with Java classes
(defn display [text]
(let [frame (new JFrame "MyFrame")]
(.add frame (new JLabel text))
(.setSize frame 300 200)
(.setVisible frame true)))
static void display(String text) {
	 JFrame frame = new JFrame("MyFrame");
	 frame.add(new JLabel(text));
	 frame.setSize(300, 200);
	 frame.setVisible(true);
}
a pattern!
onsdag 25 september 13
static void display(String text) {
	 JFrame frame = new JFrame("MyFrame");
	 with (frame) {
	 	 .add(new JLabel(text));
	 	 .setSize(300, 200);
	 	 .setVisible(true);
	 }
}
Working with Java classes
(defn display [text]
(let [frame (new JFrame "MyFrame")]
(.add frame (new JLabel text))
(.setSize frame 300 200)
(.setVisible frame true)))
onsdag 25 september 13
(defn display [text]
(let [frame (new JFrame "MyFrame")]
(doto frame
(.add (new JLabel text))
(.setSize 300 200)
(.setVisible true))))
Working with Java classes
static void display(String text) {
	 JFrame frame = new JFrame("MyFrame");
	 with (frame) {
	 	 .add(new JLabel(text));
	 	 .setSize(300, 200);
	 	 .setVisible(true);
	 }
}
onsdag 25 september 13
(defn display [text]
(doto (new JFrame "MyFrame")
(.add (new JLabel text))
(.setSize 300 200)
(.setVisible true)))
Working with Java classes
static void display(String text) {
	 JFrame frame = new JFrame("MyFrame");
	 frame.add(new JLabel(text));
	 frame.setSize(300, 200);
	 frame.setVisible(true);
}
onsdag 25 september 13
(defn display [text]
(doto (new JFrame "MyFrame")
(.add (new JLabel text))
(.setSize 300 200)
(.setVisible true)))
Working with Java classes
static void display(String text) {
	 JFrame frame = new JFrame("MyFrame");
	 frame.add(new JLabel(text));
	 frame.setSize(300, 200);
	 frame.setVisible(true);
}
Ok, nice,
but in practice you would
never want something like this?
onsdag 25 september 13
static void write(String fileName, String text) throws IOException {
	 try (Writer writer = new FileWriter(fileName)) {
	 	 writer.write(text);
	 }
}
Trust me, you want macros
onsdag 25 september 13
static void write(String fileName, String text) throws IOException {
	 try (Writer writer = new FileWriter(fileName)) {
	 	 writer.write(text);
	 }
}
Trust me, you want macros
(defn write [fileName text]
(with-open [writer (new FileWriter fileName)]
(.write writer text)))
onsdag 25 september 13
Toy?
onsdag 25 september 13
Structure in
Modules - package
Abstraction - interface
Implementation - class
onsdag 25 september 13
Structure in
Modules - package
Abstraction - interface
Implementation - class
Problems
mutable state?
static methods?
inheritance?
constants?
onsdag 25 september 13
Structure in
Modules
namespace - first-class, dynamic, import, aliasing
Abstraction
defprotocol - can be added later
Implementation
defrecord - immutable, equals, hashcode, etc
deftype - may mutate, only user functionilty
reify - singleton
gen-class & proxy - for Java interop
onsdag 25 september 13
Records - creating
(ns my.namespace)
(defrecord Person [firstName lastName])
(new Person "Jan" "Kronquist")
onsdag 25 september 13
Records - creating
; #my.namespace.Person{:firstName "Jan", :lastName "Kronquist"}
(ns my.namespace)
(defrecord Person [firstName lastName])
(new Person "Jan" "Kronquist")
onsdag 25 september 13
Records - field access
; #my.namespace.Person{:firstName "Jan", :lastName "Kronquist"}
(ns my.namespace)
(defrecord Person [firstName lastName])
(new Person "Jan" "Kronquist")
(def person (new Person "Jan" "Kronquist"))
(.firstName person)
onsdag 25 september 13
Records - field access
; #my.namespace.Person{:firstName "Jan", :lastName "Kronquist"}
(ns my.namespace)
(defrecord Person [firstName lastName])
(new Person "Jan" "Kronquist")
(def person (new Person "Jan" "Kronquist"))
(.firstName person)
; "Jan"
onsdag 25 september 13
Records - named parameters
; #my.namespace.Person{:firstName "Jan", :lastName "Kronquist"}
(ns my.namespace)
(defrecord Person [firstName lastName])
(new Person "Jan" "Kronquist")
(def person (new Person "Jan" "Kronquist"))
(.firstName person)
; "Jan"
(map->Person {:lastName "Kronquist" :firstName "Jan"})
onsdag 25 september 13
Records - named parameters
; #my.namespace.Person{:firstName "Jan", :lastName "Kronquist"}
(ns my.namespace)
(defrecord Person [firstName lastName])
(new Person "Jan" "Kronquist")
(def person (new Person "Jan" "Kronquist"))
(.firstName person)
; "Jan"
(map->Person {:lastName "Kronquist" :firstName "Jan"})
; #my.namespace.Person{:firstName "Jan", :lastName "Kronquist"}
onsdag 25 september 13
Records and protocols
(defprotocol Nameable
(getName [this]))
onsdag 25 september 13
Records and protocols
(defprotocol Nameable
(getName [this]))
(defrecord Person [firstName lastName]
Nameable
(getName [this] (str firstName " " lastName)))
(getName (new Person "Jan" "Kronquist"))
; "Jan Kronquist"
Person class implements
Nameable interface
onsdag 25 september 13
Records and protocols
(defprotocol Nameable
(getName [this]))
(defrecord Person [firstName lastName])
(extend-protocol Nameable
Person
(getName [this] (str (.firstName this) " " (.lastName this))))
(getName (new Person "Jan" "Kronquist"))
; "Jan Kronquist"
(defrecord Person [firstName lastName]
Nameable
(getName [this] (str firstName " " lastName)))
(getName (new Person "Jan" "Kronquist"))
; "Jan Kronquist"
Person class implements
Nameable interface
Person extended by
Nameable after definition!
onsdag 25 september 13
Records and protocols
(defprotocol Nameable
(getName [this]))
(defrecord Person [firstName lastName])
(extend-protocol Nameable
Person
(getName [this] (str (.firstName this) " " (.lastName this))))
(getName (new Person "Jan" "Kronquist"))
; "Jan Kronquist"
(defrecord Person [firstName lastName]
Nameable
(getName [this] (str firstName " " lastName)))
(.getName (new Person "Jan" "Kronquist"))
; "Jan Kronquist"
Method getName
exists on Person class
onsdag 25 september 13
Records and protocols
(defprotocol Nameable
(getName [this]))
(defrecord Person [firstName lastName])
(extend-protocol Nameable
Person
(getName [this] (str (.firstName this) " " (.lastName this))))
(.getName (new Person "Jan" "Kronquist"))
; IllegalArgumentException No matching field found: getName
(defrecord Person [firstName lastName]
Nameable
(getName [this] (str firstName " " lastName)))
(.getName (new Person "Jan" "Kronquist"))
; "Jan Kronquist"
Method getName
exists on Person class
But not in this case!
onsdag 25 september 13
Editors and IDEs?
Eclipse - Counterclockwise
IntelliJ - La Clojure
Light Table
Sublime
Textmate
Emacs
onsdag 25 september 13
Eclipse Counterclockwise
✓Restrictive formatting
✓Paren coloring
✓Typing suggestions
✓Being Eclipse
https://code.google.com/p/counterclockwise/
onsdag 25 september 13
Light table
✓Cool
✓Insta-REPL
http://www.lighttable.com/
onsdag 25 september 13
Sublime
✓General purpose editor
✓Typing suggestions
http://www.sublimetext.com/
onsdag 25 september 13
Repositories
Maven style
Maven central
http://clojars.org/repo
onsdag 25 september 13
Build tools
Maven plugin
Gradle plugin
Leiningen
onsdag 25 september 13
Leiningen
(defproject myproject "0.5.0-SNAPSHOT"
:description "A project for doing things."
:url "http://github.com/foo/bar"
:dependencies [[org.clojure/clojure "1.5.1"]
[ring/ring-core "1.2.0 "]]
:plugins [[lein-ring "0.4.5"]])
onsdag 25 september 13
Dynamic typing
onsdag 25 september 13
Dynamic typing?
Robert Smallshire - The Unreasonable Effectiveness of Dynamic Typing for Practical Programs
onsdag 25 september 13
Dynamic typing is scary
Compiler won’t find errors
Limited tool support
Performance?
onsdag 25 september 13
What made me think twice
Web server
onsdag 25 september 13
What made me think twice
Web server
onsdag 25 september 13
Clojure makes dynamic typing ok
REPL
Immutable data structure
Pure functions
Automated tests
onsdag 25 september 13
Dynamic typing and performance?
Clojure is compiled to bytecode
Generally good enough!
onsdag 25 september 13
Dynamic typing and performance?
Clojure is compiled to bytecode
Generally good enough!
(defn len [^String x]
(.length x))
onsdag 25 september 13
Studies
Stefan Hanenberg & Lutz Prechelt
Dynamic is more productive
No difference in reliability
Robert Smallshire - 2 % defects are type errors (GitHub)
onsdag 25 september 13
Conclusion
onsdag 25 september 13
Macros? Are you crazy?
Dynamic typing is scary
Convinced?
Lisp looks weird
Just a toy language
onsdag 25 september 13
Macros? Are you crazy?
Dynamic typing is usable
Convinced?
Lisp looks weird
Just a toy language
REPL
Immutable data structure
Pure functions
Automated tests
onsdag 25 september 13
Macros? Are you crazy?
Lisp is consistent
Dynamic typing is usable
Convinced?
Just a toy language
REPL
Immutable data structure
Pure functions
Automated tests
(operation operand1 operand2 ...)
onsdag 25 september 13
Macros? Are you crazy?
Lisp is consistent
Dynamic typing is usable
Convinced? REPL
Immutable data structure
Pure functions
Automated tests
Interesting language
(operation operand1 operand2 ...)
Namespaces
Prototcols
Records
onsdag 25 september 13
Macros? Are you crazy?
Lisp is consistent
Dynamic typing is usable
Convinced? REPL
Immutable data structure
Pure functions
Automated tests
Interesting language
(operation operand1 operand2 ...)
Lazy seqs STM Functional
Namespaces
Prototcols
Records
onsdag 25 september 13
Macros? Maybe.......
Lisp is consistent
Dynamic typing is usable
Convinced? REPL
Immutable data structure
Pure functions
Automated tests
Interesting language
(operation operand1 operand2 ...)
Lazy seqs STM Functional
Namespaces
Prototcols
Records
try (Writer writer = new FileWriter(fileName))
	 writer.write(text);
}
onsdag 25 september 13
Macros? Maybe.......
Lisp is consistent
Dynamic typing is usable
Convinced? REPL
Immutable data structure
Pure functions
Automated tests
Interesting language
(operation operand1 operand2 ...)
Lazy seqs STM Functional
Namespaces
Prototcols
Records
try (Writer writer = new FileWriter(fileName))
	 writer.write(text);
}
DSL Reuse Structure
onsdag 25 september 13
Further resources
http://clojure.org/
http://tryclj.com/
http://www.4clojure.com
http://clojure-doc.org/
onsdag 25 september 13
Questions?
onsdag 25 september 13

More Related Content

PDF
Clojure for Java developers - Stockholm
PDF
What can be done with Java, but should better be done with Erlang (@pavlobaron)
KEY
Clojure Intro
ODP
Naïveté vs. Experience
KEY
Code as data as code.
PDF
Clojure for Java developers
PDF
Predictably
ODP
Ast transformations
Clojure for Java developers - Stockholm
What can be done with Java, but should better be done with Erlang (@pavlobaron)
Clojure Intro
Naïveté vs. Experience
Code as data as code.
Clojure for Java developers
Predictably
Ast transformations

What's hot (20)

PDF
core.logic introduction
ODP
Clojure made simple - Lightning talk
ODP
AST Transformations
ODP
Turtle Graphics in Groovy
ODP
AST Transformations at JFokus
PDF
Better Software: introduction to good code
PPTX
ES6 in Real Life
PDF
The Logical Burrito - pattern matching, term rewriting and unification
ODP
Getting started with Clojure
PDF
From Java to Parellel Clojure - Clojure South 2019
PPTX
Clojure And Swing
PDF
Fun never stops. introduction to haskell programming language
PPSX
Java.lang.object
PDF
Clojure 1.1 And Beyond
PDF
The Ring programming language version 1.2 book - Part 79 of 84
PDF
Clojure, Plain and Simple
PDF
JavaScript Survival Guide
PDF
concurrency with GPars
PDF
Functional Programming with Groovy
PPTX
Pattern Matching in Java 14
core.logic introduction
Clojure made simple - Lightning talk
AST Transformations
Turtle Graphics in Groovy
AST Transformations at JFokus
Better Software: introduction to good code
ES6 in Real Life
The Logical Burrito - pattern matching, term rewriting and unification
Getting started with Clojure
From Java to Parellel Clojure - Clojure South 2019
Clojure And Swing
Fun never stops. introduction to haskell programming language
Java.lang.object
Clojure 1.1 And Beyond
The Ring programming language version 1.2 book - Part 79 of 84
Clojure, Plain and Simple
JavaScript Survival Guide
concurrency with GPars
Functional Programming with Groovy
Pattern Matching in Java 14
Ad

Viewers also liked (17)

PDF
Zarak/Resume
PDF
SmartDecision Whitepaper
PPS
Lenguaje corporal. Body language.
PDF
Trinity Kings World Leadership: Patillo Family Kingdom curse all the people w...
PPTX
Personal statement sept 12
PDF
Буклет
PPSX
L´heure Bleue
PDF
Trinity Kings World Leadership: Government officials(Law enforcement), Allegh...
PDF
Хто наживається на перевірці лічильників? Результати громадської експертизи
PPTX
Christie reed using photoshop to enhance images
PPT
Knossos slide show
PPS
Upute za izradu prezentacije
PPSX
Snow Art by Simon Beck
PPTX
Feathers in a Cage (Part 1 of 2)
PPTX
How big is your Referral Gap - final
PPS
Polynesiaview
PDF
Bs blue ocean strategy
Zarak/Resume
SmartDecision Whitepaper
Lenguaje corporal. Body language.
Trinity Kings World Leadership: Patillo Family Kingdom curse all the people w...
Personal statement sept 12
Буклет
L´heure Bleue
Trinity Kings World Leadership: Government officials(Law enforcement), Allegh...
Хто наживається на перевірці лічильників? Результати громадської експертизи
Christie reed using photoshop to enhance images
Knossos slide show
Upute za izradu prezentacije
Snow Art by Simon Beck
Feathers in a Cage (Part 1 of 2)
How big is your Referral Gap - final
Polynesiaview
Bs blue ocean strategy
Ad

Similar to JavaOne 2013 - Clojure for Java Developers (20)

PDF
Introduction to clojure
PDF
Stefan Richter - Writing simple, readable and robust code: Examples in Java, ...
PDF
Clojure talk at Münster JUG
PDF
Clojure - An Introduction for Lisp Programmers
PDF
The Enterprise Strikes Back
PDF
Full Stack Clojure
ODP
Clojure
PDF
Clojure - A practical LISP for the JVM
PDF
Appengine ja-night-10
PDF
Introduction to Clojure
PDF
Clojure made-simple - John Stevenson
PDF
The Not Java That's Not Scala
PDF
Clojure class
ZIP
Clojure: Functional Concurrency for the JVM (presented at Open Source Bridge)
PDF
A Tour Through the Groovy Ecosystem
ODP
Clojure presentation
PDF
Clojure - LISP on the JVM
PDF
Exploring Clojurescript
PDF
Introduction to clojure
PDF
Clojure - An Introduction for Java Programmers
Introduction to clojure
Stefan Richter - Writing simple, readable and robust code: Examples in Java, ...
Clojure talk at Münster JUG
Clojure - An Introduction for Lisp Programmers
The Enterprise Strikes Back
Full Stack Clojure
Clojure
Clojure - A practical LISP for the JVM
Appengine ja-night-10
Introduction to Clojure
Clojure made-simple - John Stevenson
The Not Java That's Not Scala
Clojure class
Clojure: Functional Concurrency for the JVM (presented at Open Source Bridge)
A Tour Through the Groovy Ecosystem
Clojure presentation
Clojure - LISP on the JVM
Exploring Clojurescript
Introduction to clojure
Clojure - An Introduction for Java Programmers

Recently uploaded (20)

PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PPTX
A Presentation on Artificial Intelligence
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Spectral efficient network and resource selection model in 5G networks
PPTX
Cloud computing and distributed systems.
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Encapsulation_ Review paper, used for researhc scholars
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Modernizing your data center with Dell and AMD
PDF
Electronic commerce courselecture one. Pdf
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
A Presentation on Artificial Intelligence
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
“AI and Expert System Decision Support & Business Intelligence Systems”
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
NewMind AI Weekly Chronicles - August'25 Week I
Reach Out and Touch Someone: Haptics and Empathic Computing
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Spectral efficient network and resource selection model in 5G networks
Cloud computing and distributed systems.
MYSQL Presentation for SQL database connectivity
Unlocking AI with Model Context Protocol (MCP)
Encapsulation_ Review paper, used for researhc scholars
20250228 LYD VKU AI Blended-Learning.pptx
The AUB Centre for AI in Media Proposal.docx
Per capita expenditure prediction using model stacking based on satellite ima...
Modernizing your data center with Dell and AMD
Electronic commerce courselecture one. Pdf
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx

JavaOne 2013 - Clojure for Java Developers

  • 2. About me onsdag 25 september 13
  • 3. About me 1986 - Basic onsdag 25 september 13
  • 4. About me 1990 - 68K assembly 1986 - Basic onsdag 25 september 13
  • 5. About me 1990 - 68K assembly1986 - Basic 1995 - OOP onsdag 25 september 13
  • 6. 1997 - University About me 1990 - 68K assembly1986 - Basic 1995 - OOP onsdag 25 september 13
  • 7. 1997 - University About me 1990 - 68K assembly1986 - Basic 2005 - IoC,Aspects, Mixins 1995 - OOP onsdag 25 september 13
  • 8. 2008 - Functional 1997 - University About me 1990 - 68K assembly1986 - Basic 2005 - IoC,Aspects, Mixins 1995 - OOP onsdag 25 september 13
  • 9. 2012 - Lisp & dynamic typing 2008 - Functional 1997 - University About me 1990 - 68K assembly1986 - Basic 2005 - IoC,Aspects, Mixins 1995 - OOP onsdag 25 september 13
  • 10. This talk is not A comprehensive introduction to Clojure About idiomatic Clojure Another talk about functional programming onsdag 25 september 13
  • 11. Killer apps onsdag 25 september 13
  • 15. What is Clojure? Created 2007 by Rich Hickey Lisp Runs on JVM, CLR & JavaScript Design for concurrency onsdag 25 september 13
  • 16. Clojure example (defn divisible? [n d] (== 0 (mod n d))) (defn divides [n] (partial divisible? n)) (declare primes) (defn prime? [n] (not (some (divides n) (take-while #(< % n) primes)))) (def primes (lazy-cat [2 3 5] (filter prime? (drop 7 (range))))) onsdag 25 september 13
  • 17. Why Clojure? onsdag 25 september 13
  • 18. Why Clojure? Lisp - Code as data & Syntactic abstraction onsdag 25 september 13
  • 19. Why Clojure? Lisp - Code as data & Syntactic abstraction Functional - Declarative, Immutable onsdag 25 september 13
  • 20. Why Clojure? Lisp - Code as data & Syntactic abstraction Functional - Declarative, Immutable Interactive development environment onsdag 25 september 13
  • 21. Why Clojure? Lisp - Code as data & Syntactic abstraction Functional - Declarative, Immutable Interactive development environment Great eco-system - dynamic helps compatibility onsdag 25 september 13
  • 22. Why Clojure? Lisp - Code as data & Syntactic abstraction Functional - Declarative, Immutable Interactive development environment Great eco-system - dynamic helps compatibility Wrapper-free Java access onsdag 25 september 13
  • 23. Why Clojure? Lisp - Code as data & Syntactic abstraction Functional - Declarative, Immutable Interactive development environment Great eco-system - dynamic helps compatibility Wrapper-free Java access Less complexity onsdag 25 september 13
  • 25. Common complaints Lisp looks weird onsdag 25 september 13
  • 26. Common complaints Dynamic typing is scary Lisp looks weird onsdag 25 september 13
  • 27. Common complaints Dynamic typing is scary Lisp looks weird Just a toy language onsdag 25 september 13
  • 28. Common complaints Dynamic typing is scary Lisp looks weird Macros? Are you crazy? Just a toy language onsdag 25 september 13
  • 30. Clojure Atomic Data Types Arbitrary precision integers: 12345678987654 Doubles: 1.234 BigDecimals: 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" Rich Hickey - Clojure for Java Programmers - http://www.youtube.com/watch?v=P76Vbsk_3J0 onsdag 25 september 13
  • 31. JavaScript Data Structures Arrays [1, 2, 3] ["fred", "ethel", "lucy"] Objects {name: "Jan Kronquist", age: 37} onsdag 25 september 13
  • 32. Clojure Data Structures Vectors [1, 2, 3] ["fred", "ethel", "lucy"] Maps {:name "Jan Kronquist", :age 37} move colon onsdag 25 september 13
  • 33. Clojure Data Structures Vectors [1 2 3] ["fred" "ethel" "lucy"] Maps {:name "Jan Kronquist" :age 37} commas are whitespace! onsdag 25 september 13
  • 34. Clojure Data Structures Vectors - indexed access [1 2 3] ["fred" "ethel" "lucy"] Maps {:name "Jan Kronquist" :age 37} Lists - singly linked (1 2 3 4 5) (fred ethel lucy) (list 1 2 3) Sets #{fred ethel lucy} onsdag 25 september 13
  • 35. Demo in REPL user=> "hello" "hello" user=> 5 5 user=> [1 2 3] [1 2 3] user=> qwe java.lang.RuntimeException: Unable to resolve symbol: qwe user=> (def qwe "hello world") #'user/qwe user=> qwe "hello world" onsdag 25 september 13
  • 36. "Hello world") The strangeness of Lisp println( onsdag 25 september 13
  • 37. "Hello world") The strangeness of Lisp println( onsdag 25 september 13
  • 38. "Hello world") The strangeness of Lisp println( (operator operand1 operand2 ...) Determines how the list is evaluated onsdag 25 september 13
  • 39. (= (.toString (+ 1 2)) "3") Example evaluation (= (.toString (+ 1 2)) "3") onsdag 25 september 13
  • 40. (= (.toString (+ 1 2)) "3") Example evaluation onsdag 25 september 13
  • 41. (= (.toString (+ 1 2)) "3") Example evaluation (= (.toString 3) "3") onsdag 25 september 13
  • 42. (= (.toString (+ 1 2)) "3") Example evaluation (= (.toString 3) "3") (= "3" "3") onsdag 25 september 13
  • 43. (= (.toString (+ 1 2)) "3") Example evaluation (= (.toString 3) "3") (= "3" "3") true onsdag 25 september 13
  • 45. int i = 5; (def i 5) OR (let [i 5] ...) if (x > 5) { return y; } else { return z; } (if (> x 5) y z) x * y * z (* x y z) foo(x, y, z) (foo x y z) object.method(x, y) (.method object x y) public String sayHello(String x) { return "Hello " + x; } (defn sayHello [x] (str "Hello " x)) onsdag 25 september 13
  • 46. int i = 5; (def i 5) OR (let [i 5] ...) if (x > 5) { return y; } else { return z; } (if (> x 5) y z) x * y * z (* x y z) foo(x, y, z) (foo x y z) object.method(x, y) (.method object x y) public String sayHello(String x) { return "Hello " + x; } (defn sayHello [x] (str "Hello " x)) onsdag 25 september 13
  • 47. int i = 5; (def i 5) OR (let [i 5] ...) if (x > 5) { return y; } else { return z; } (if (> x 5) y z) x * y * z (* x y z) foo(x, y, z) (foo x y z) object.method(x, y) (.method object x y) public String sayHello(String x) { return "Hello " + x; } (defn sayHello [x] (str "Hello " x)) onsdag 25 september 13
  • 48. int i = 5; (def i 5) OR (let [i 5] ...) if (x > 5) { return y; } else { return z; } (if (> x 5) y z) x * y * z (* x y z) foo(x, y, z) (foo x y z) object.method(x, y) (.method object x y) public String sayHello(String x) { return "Hello " + x; } (defn sayHello [x] (str "Hello " x)) onsdag 25 september 13
  • 49. int i = 5; (def i 5) OR (let [i 5] ...) if (x > 5) { return y; } else { return z; } (if (> x 5) y z) x * y * z (* x y z) foo(x, y, z) (foo x y z) object.method(x, y) (.method object x y) public String sayHello(String x) { return "Hello " + x; } (defn sayHello [x] (str "Hello " x)) onsdag 25 september 13
  • 50. int i = 5; (def i 5) OR (let [i 5] ...) if (x > 5) { return y; } else { return z; } (if (> x 5) y z) x * y * z (* x y z) foo(x, y, z) (foo x y z) object.method(x, y) (.method object x y) public String sayHello(String x) { return "Hello " + x; } (defn sayHello [x] (str "Hello " x)) onsdag 25 september 13
  • 51. Java Quiz public static void main(String[] args) { int bang = 1; do while (bang>=1) System.out.print(" bang is "+ bang); while (bang>1); } onsdag 25 september 13
  • 53. Working with Java classes (defn display [text] (let [frame (new JFrame "MyFrame")] (.add frame (new JLabel text)) (.setSize frame 300 200) (.setVisible frame true))) static void display(String text) { JFrame frame = new JFrame("MyFrame"); frame.add(new JLabel(text)); frame.setSize(300, 200); frame.setVisible(true); } onsdag 25 september 13
  • 54. Working with Java classes (defn display [text] (let [frame (new JFrame "MyFrame")] (.add frame (new JLabel text)) (.setSize frame 300 200) (.setVisible frame true))) static void display(String text) { JFrame frame = new JFrame("MyFrame"); frame.add(new JLabel(text)); frame.setSize(300, 200); frame.setVisible(true); } (display "Hello World") onsdag 25 september 13
  • 55. Working with Java classes (defn display [text] (let [frame (new JFrame "MyFrame")] (.add frame (new JLabel text)) (.setSize frame 300 200) (.setVisible frame true))) static void display(String text) { JFrame frame = new JFrame("MyFrame"); frame.add(new JLabel(text)); frame.setSize(300, 200); frame.setVisible(true); } a pattern! onsdag 25 september 13
  • 56. static void display(String text) { JFrame frame = new JFrame("MyFrame"); with (frame) { .add(new JLabel(text)); .setSize(300, 200); .setVisible(true); } } Working with Java classes (defn display [text] (let [frame (new JFrame "MyFrame")] (.add frame (new JLabel text)) (.setSize frame 300 200) (.setVisible frame true))) onsdag 25 september 13
  • 57. (defn display [text] (let [frame (new JFrame "MyFrame")] (doto frame (.add (new JLabel text)) (.setSize 300 200) (.setVisible true)))) Working with Java classes static void display(String text) { JFrame frame = new JFrame("MyFrame"); with (frame) { .add(new JLabel(text)); .setSize(300, 200); .setVisible(true); } } onsdag 25 september 13
  • 58. (defn display [text] (doto (new JFrame "MyFrame") (.add (new JLabel text)) (.setSize 300 200) (.setVisible true))) Working with Java classes static void display(String text) { JFrame frame = new JFrame("MyFrame"); frame.add(new JLabel(text)); frame.setSize(300, 200); frame.setVisible(true); } onsdag 25 september 13
  • 59. (defn display [text] (doto (new JFrame "MyFrame") (.add (new JLabel text)) (.setSize 300 200) (.setVisible true))) Working with Java classes static void display(String text) { JFrame frame = new JFrame("MyFrame"); frame.add(new JLabel(text)); frame.setSize(300, 200); frame.setVisible(true); } Ok, nice, but in practice you would never want something like this? onsdag 25 september 13
  • 60. static void write(String fileName, String text) throws IOException { try (Writer writer = new FileWriter(fileName)) { writer.write(text); } } Trust me, you want macros onsdag 25 september 13
  • 61. static void write(String fileName, String text) throws IOException { try (Writer writer = new FileWriter(fileName)) { writer.write(text); } } Trust me, you want macros (defn write [fileName text] (with-open [writer (new FileWriter fileName)] (.write writer text))) onsdag 25 september 13
  • 63. Structure in Modules - package Abstraction - interface Implementation - class onsdag 25 september 13
  • 64. Structure in Modules - package Abstraction - interface Implementation - class Problems mutable state? static methods? inheritance? constants? onsdag 25 september 13
  • 65. Structure in Modules namespace - first-class, dynamic, import, aliasing Abstraction defprotocol - can be added later Implementation defrecord - immutable, equals, hashcode, etc deftype - may mutate, only user functionilty reify - singleton gen-class & proxy - for Java interop onsdag 25 september 13
  • 66. Records - creating (ns my.namespace) (defrecord Person [firstName lastName]) (new Person "Jan" "Kronquist") onsdag 25 september 13
  • 67. Records - creating ; #my.namespace.Person{:firstName "Jan", :lastName "Kronquist"} (ns my.namespace) (defrecord Person [firstName lastName]) (new Person "Jan" "Kronquist") onsdag 25 september 13
  • 68. Records - field access ; #my.namespace.Person{:firstName "Jan", :lastName "Kronquist"} (ns my.namespace) (defrecord Person [firstName lastName]) (new Person "Jan" "Kronquist") (def person (new Person "Jan" "Kronquist")) (.firstName person) onsdag 25 september 13
  • 69. Records - field access ; #my.namespace.Person{:firstName "Jan", :lastName "Kronquist"} (ns my.namespace) (defrecord Person [firstName lastName]) (new Person "Jan" "Kronquist") (def person (new Person "Jan" "Kronquist")) (.firstName person) ; "Jan" onsdag 25 september 13
  • 70. Records - named parameters ; #my.namespace.Person{:firstName "Jan", :lastName "Kronquist"} (ns my.namespace) (defrecord Person [firstName lastName]) (new Person "Jan" "Kronquist") (def person (new Person "Jan" "Kronquist")) (.firstName person) ; "Jan" (map->Person {:lastName "Kronquist" :firstName "Jan"}) onsdag 25 september 13
  • 71. Records - named parameters ; #my.namespace.Person{:firstName "Jan", :lastName "Kronquist"} (ns my.namespace) (defrecord Person [firstName lastName]) (new Person "Jan" "Kronquist") (def person (new Person "Jan" "Kronquist")) (.firstName person) ; "Jan" (map->Person {:lastName "Kronquist" :firstName "Jan"}) ; #my.namespace.Person{:firstName "Jan", :lastName "Kronquist"} onsdag 25 september 13
  • 72. Records and protocols (defprotocol Nameable (getName [this])) onsdag 25 september 13
  • 73. Records and protocols (defprotocol Nameable (getName [this])) (defrecord Person [firstName lastName] Nameable (getName [this] (str firstName " " lastName))) (getName (new Person "Jan" "Kronquist")) ; "Jan Kronquist" Person class implements Nameable interface onsdag 25 september 13
  • 74. Records and protocols (defprotocol Nameable (getName [this])) (defrecord Person [firstName lastName]) (extend-protocol Nameable Person (getName [this] (str (.firstName this) " " (.lastName this)))) (getName (new Person "Jan" "Kronquist")) ; "Jan Kronquist" (defrecord Person [firstName lastName] Nameable (getName [this] (str firstName " " lastName))) (getName (new Person "Jan" "Kronquist")) ; "Jan Kronquist" Person class implements Nameable interface Person extended by Nameable after definition! onsdag 25 september 13
  • 75. Records and protocols (defprotocol Nameable (getName [this])) (defrecord Person [firstName lastName]) (extend-protocol Nameable Person (getName [this] (str (.firstName this) " " (.lastName this)))) (getName (new Person "Jan" "Kronquist")) ; "Jan Kronquist" (defrecord Person [firstName lastName] Nameable (getName [this] (str firstName " " lastName))) (.getName (new Person "Jan" "Kronquist")) ; "Jan Kronquist" Method getName exists on Person class onsdag 25 september 13
  • 76. Records and protocols (defprotocol Nameable (getName [this])) (defrecord Person [firstName lastName]) (extend-protocol Nameable Person (getName [this] (str (.firstName this) " " (.lastName this)))) (.getName (new Person "Jan" "Kronquist")) ; IllegalArgumentException No matching field found: getName (defrecord Person [firstName lastName] Nameable (getName [this] (str firstName " " lastName))) (.getName (new Person "Jan" "Kronquist")) ; "Jan Kronquist" Method getName exists on Person class But not in this case! onsdag 25 september 13
  • 77. Editors and IDEs? Eclipse - Counterclockwise IntelliJ - La Clojure Light Table Sublime Textmate Emacs onsdag 25 september 13
  • 78. Eclipse Counterclockwise ✓Restrictive formatting ✓Paren coloring ✓Typing suggestions ✓Being Eclipse https://code.google.com/p/counterclockwise/ onsdag 25 september 13
  • 80. Sublime ✓General purpose editor ✓Typing suggestions http://www.sublimetext.com/ onsdag 25 september 13
  • 82. Build tools Maven plugin Gradle plugin Leiningen onsdag 25 september 13
  • 83. Leiningen (defproject myproject "0.5.0-SNAPSHOT" :description "A project for doing things." :url "http://github.com/foo/bar" :dependencies [[org.clojure/clojure "1.5.1"] [ring/ring-core "1.2.0 "]] :plugins [[lein-ring "0.4.5"]]) onsdag 25 september 13
  • 84. Dynamic typing onsdag 25 september 13
  • 85. Dynamic typing? Robert Smallshire - The Unreasonable Effectiveness of Dynamic Typing for Practical Programs onsdag 25 september 13
  • 86. Dynamic typing is scary Compiler won’t find errors Limited tool support Performance? onsdag 25 september 13
  • 87. What made me think twice Web server onsdag 25 september 13
  • 88. What made me think twice Web server onsdag 25 september 13
  • 89. Clojure makes dynamic typing ok REPL Immutable data structure Pure functions Automated tests onsdag 25 september 13
  • 90. Dynamic typing and performance? Clojure is compiled to bytecode Generally good enough! onsdag 25 september 13
  • 91. Dynamic typing and performance? Clojure is compiled to bytecode Generally good enough! (defn len [^String x] (.length x)) onsdag 25 september 13
  • 92. Studies Stefan Hanenberg & Lutz Prechelt Dynamic is more productive No difference in reliability Robert Smallshire - 2 % defects are type errors (GitHub) onsdag 25 september 13
  • 94. Macros? Are you crazy? Dynamic typing is scary Convinced? Lisp looks weird Just a toy language onsdag 25 september 13
  • 95. Macros? Are you crazy? Dynamic typing is usable Convinced? Lisp looks weird Just a toy language REPL Immutable data structure Pure functions Automated tests onsdag 25 september 13
  • 96. Macros? Are you crazy? Lisp is consistent Dynamic typing is usable Convinced? Just a toy language REPL Immutable data structure Pure functions Automated tests (operation operand1 operand2 ...) onsdag 25 september 13
  • 97. Macros? Are you crazy? Lisp is consistent Dynamic typing is usable Convinced? REPL Immutable data structure Pure functions Automated tests Interesting language (operation operand1 operand2 ...) Namespaces Prototcols Records onsdag 25 september 13
  • 98. Macros? Are you crazy? Lisp is consistent Dynamic typing is usable Convinced? REPL Immutable data structure Pure functions Automated tests Interesting language (operation operand1 operand2 ...) Lazy seqs STM Functional Namespaces Prototcols Records onsdag 25 september 13
  • 99. Macros? Maybe....... Lisp is consistent Dynamic typing is usable Convinced? REPL Immutable data structure Pure functions Automated tests Interesting language (operation operand1 operand2 ...) Lazy seqs STM Functional Namespaces Prototcols Records try (Writer writer = new FileWriter(fileName)) writer.write(text); } onsdag 25 september 13
  • 100. Macros? Maybe....... Lisp is consistent Dynamic typing is usable Convinced? REPL Immutable data structure Pure functions Automated tests Interesting language (operation operand1 operand2 ...) Lazy seqs STM Functional Namespaces Prototcols Records try (Writer writer = new FileWriter(fileName)) writer.write(text); } DSL Reuse Structure onsdag 25 september 13