SlideShare une entreprise Scribd logo
1  sur  102
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances

Clojure made simple - Lightning talk
Clojure made simple - Lightning talkClojure made simple - Lightning talk
Clojure made simple - Lightning talkJohn Stevenson
 
AST Transformations
AST TransformationsAST Transformations
AST TransformationsHamletDRC
 
Turtle Graphics in Groovy
Turtle Graphics in GroovyTurtle Graphics in Groovy
Turtle Graphics in GroovyJim Driscoll
 
AST Transformations at JFokus
AST Transformations at JFokusAST Transformations at JFokus
AST Transformations at JFokusHamletDRC
 
Better Software: introduction to good code
Better Software: introduction to good codeBetter Software: introduction to good code
Better Software: introduction to good codeGiordano Scalzo
 
The Logical Burrito - pattern matching, term rewriting and unification
The Logical Burrito - pattern matching, term rewriting and unificationThe Logical Burrito - pattern matching, term rewriting and unification
The Logical Burrito - pattern matching, term rewriting and unificationNorman Richards
 
Getting started with Clojure
Getting started with ClojureGetting started with Clojure
Getting started with ClojureJohn Stevenson
 
From Java to Parellel Clojure - Clojure South 2019
From Java to Parellel Clojure - Clojure South 2019From Java to Parellel Clojure - Clojure South 2019
From Java to Parellel Clojure - Clojure South 2019Leonardo Borges
 
Fun never stops. introduction to haskell programming language
Fun never stops. introduction to haskell programming languageFun never stops. introduction to haskell programming language
Fun never stops. introduction to haskell programming languagePawel Szulc
 
Clojure 1.1 And Beyond
Clojure 1.1 And BeyondClojure 1.1 And Beyond
Clojure 1.1 And BeyondMike Fogus
 
The Ring programming language version 1.2 book - Part 79 of 84
The Ring programming language version 1.2 book - Part 79 of 84The Ring programming language version 1.2 book - Part 79 of 84
The Ring programming language version 1.2 book - Part 79 of 84Mahmoud Samir Fayed
 
Clojure, Plain and Simple
Clojure, Plain and SimpleClojure, Plain and Simple
Clojure, Plain and SimpleBen Mabey
 
JavaScript Survival Guide
JavaScript Survival GuideJavaScript Survival Guide
JavaScript Survival GuideGiordano Scalzo
 
concurrency with GPars
concurrency with GParsconcurrency with GPars
concurrency with GParsPaul King
 
Functional Programming with Groovy
Functional Programming with GroovyFunctional Programming with Groovy
Functional Programming with GroovyArturo Herrero
 

Tendances (20)

core.logic introduction
core.logic introductioncore.logic introduction
core.logic introduction
 
Clojure made simple - Lightning talk
Clojure made simple - Lightning talkClojure made simple - Lightning talk
Clojure made simple - Lightning talk
 
AST Transformations
AST TransformationsAST Transformations
AST Transformations
 
Turtle Graphics in Groovy
Turtle Graphics in GroovyTurtle Graphics in Groovy
Turtle Graphics in Groovy
 
AST Transformations at JFokus
AST Transformations at JFokusAST Transformations at JFokus
AST Transformations at JFokus
 
Better Software: introduction to good code
Better Software: introduction to good codeBetter Software: introduction to good code
Better Software: introduction to good code
 
ES6 in Real Life
ES6 in Real LifeES6 in Real Life
ES6 in Real Life
 
The Logical Burrito - pattern matching, term rewriting and unification
The Logical Burrito - pattern matching, term rewriting and unificationThe Logical Burrito - pattern matching, term rewriting and unification
The Logical Burrito - pattern matching, term rewriting and unification
 
Getting started with Clojure
Getting started with ClojureGetting started with Clojure
Getting started with Clojure
 
From Java to Parellel Clojure - Clojure South 2019
From Java to Parellel Clojure - Clojure South 2019From Java to Parellel Clojure - Clojure South 2019
From Java to Parellel Clojure - Clojure South 2019
 
Clojure And Swing
Clojure And SwingClojure And Swing
Clojure And Swing
 
Fun never stops. introduction to haskell programming language
Fun never stops. introduction to haskell programming languageFun never stops. introduction to haskell programming language
Fun never stops. introduction to haskell programming language
 
Java.lang.object
Java.lang.objectJava.lang.object
Java.lang.object
 
Clojure 1.1 And Beyond
Clojure 1.1 And BeyondClojure 1.1 And Beyond
Clojure 1.1 And Beyond
 
The Ring programming language version 1.2 book - Part 79 of 84
The Ring programming language version 1.2 book - Part 79 of 84The Ring programming language version 1.2 book - Part 79 of 84
The Ring programming language version 1.2 book - Part 79 of 84
 
Clojure, Plain and Simple
Clojure, Plain and SimpleClojure, Plain and Simple
Clojure, Plain and Simple
 
JavaScript Survival Guide
JavaScript Survival GuideJavaScript Survival Guide
JavaScript Survival Guide
 
concurrency with GPars
concurrency with GParsconcurrency with GPars
concurrency with GPars
 
Functional Programming with Groovy
Functional Programming with GroovyFunctional Programming with Groovy
Functional Programming with Groovy
 
Pattern Matching in Java 14
Pattern Matching in Java 14Pattern Matching in Java 14
Pattern Matching in Java 14
 

En vedette

SmartDecision Whitepaper
SmartDecision WhitepaperSmartDecision Whitepaper
SmartDecision WhitepaperLubov Putsko
 
Lenguaje corporal. Body language.
Lenguaje corporal. Body language.Lenguaje corporal. Body language.
Lenguaje corporal. Body language.Cachi Chien
 
Trinity Kings World Leadership: Patillo Family Kingdom curse all the people w...
Trinity Kings World Leadership: Patillo Family Kingdom curse all the people w...Trinity Kings World Leadership: Patillo Family Kingdom curse all the people w...
Trinity Kings World Leadership: Patillo Family Kingdom curse all the people w...Terrell Patillo
 
Personal statement sept 12
Personal statement sept 12Personal statement sept 12
Personal statement sept 12Jessica Cristina
 
Trinity Kings World Leadership: Government officials(Law enforcement), Allegh...
Trinity Kings World Leadership: Government officials(Law enforcement), Allegh...Trinity Kings World Leadership: Government officials(Law enforcement), Allegh...
Trinity Kings World Leadership: Government officials(Law enforcement), Allegh...Terrell Patillo
 
Хто наживається на перевірці лічильників? Результати громадської експертизи
Хто наживається на перевірці лічильників? Результати громадської експертизиХто наживається на перевірці лічильників? Результати громадської експертизи
Хто наживається на перевірці лічильників? Результати громадської експертизиЮрій Шеляженко
 
Christie reed using photoshop to enhance images
Christie reed  using photoshop to enhance imagesChristie reed  using photoshop to enhance images
Christie reed using photoshop to enhance imageschristie94
 
Upute za izradu prezentacije
Upute za izradu prezentacijeUpute za izradu prezentacije
Upute za izradu prezentacijedejanljub
 
Snow Art by Simon Beck
Snow Art by Simon BeckSnow Art by Simon Beck
Snow Art by Simon BeckCachi Chien
 
Feathers in a Cage (Part 1 of 2)
Feathers in a Cage (Part 1 of 2)Feathers in a Cage (Part 1 of 2)
Feathers in a Cage (Part 1 of 2)Cachi Chien
 
How big is your Referral Gap - final
How big is your Referral Gap - finalHow big is your Referral Gap - final
How big is your Referral Gap - finalCustomer Return
 

En vedette (17)

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

Similaire à JavaOne 2013 - Clojure for Java Developers

Distributed Data Structures
Distributed Data StructuresDistributed Data Structures
Distributed Data StructuresPDX Web & Design
 
Slides changes symfony23
Slides changes symfony23Slides changes symfony23
Slides changes symfony23Javier López
 
იოსებ ძმანაშვილი Node.js
იოსებ ძმანაშვილი   Node.jsიოსებ ძმანაშვილი   Node.js
იოსებ ძმანაშვილი Node.jsunihack
 
An introduction to Erlang and Elixir
An introduction to Erlang and ElixirAn introduction to Erlang and Elixir
An introduction to Erlang and Elixirericbmerritt
 
Programación funcional con haskell
Programación funcional con haskellProgramación funcional con haskell
Programación funcional con haskellAgustin Ramos
 
Scala: Simplifying Development
Scala: Simplifying DevelopmentScala: Simplifying Development
Scala: Simplifying Developmentmircodotta
 
JavaZone 2013 - Datomic vs EventStore
JavaZone 2013 - Datomic vs EventStoreJavaZone 2013 - Datomic vs EventStore
JavaZone 2013 - Datomic vs EventStoreJan Kronquist
 
The Not Java That's Not Scala
The Not Java That's Not ScalaThe Not Java That's Not Scala
The Not Java That's Not ScalaJustin Lee
 
The Shape of Functional Programming
The Shape of Functional ProgrammingThe Shape of Functional Programming
The Shape of Functional ProgrammingMike Fogus
 
University of arizona mobile matters - technology, a means to an end
University of arizona   mobile matters - technology, a means to an endUniversity of arizona   mobile matters - technology, a means to an end
University of arizona mobile matters - technology, a means to an endThibault Imbert
 
Building Cordova plugins for iOS
Building Cordova plugins for iOSBuilding Cordova plugins for iOS
Building Cordova plugins for iOSGrgur Grisogono
 
Groovy Ast Transformations (greach)
Groovy Ast Transformations (greach)Groovy Ast Transformations (greach)
Groovy Ast Transformations (greach)HamletDRC
 
And the Greatest of These Is ... Space
And the Greatest of These Is ... SpaceAnd the Greatest of These Is ... Space
And the Greatest of These Is ... SpaceBen Scofield
 
Securing Client Side Data
 Securing Client Side Data Securing Client Side Data
Securing Client Side DataGrgur Grisogono
 
An introduction to Ember.js
An introduction to Ember.jsAn introduction to Ember.js
An introduction to Ember.jscodeofficer
 
The Future of JVM Languages
The Future of JVM Languages The Future of JVM Languages
The Future of JVM Languages VictorSzoltysek
 

Similaire à JavaOne 2013 - Clojure for Java Developers (20)

Clojure night
Clojure nightClojure night
Clojure night
 
Distributed Data Structures
Distributed Data StructuresDistributed Data Structures
Distributed Data Structures
 
Slides changes symfony23
Slides changes symfony23Slides changes symfony23
Slides changes symfony23
 
იოსებ ძმანაშვილი Node.js
იოსებ ძმანაშვილი   Node.jsიოსებ ძმანაშვილი   Node.js
იოსებ ძმანაშვილი Node.js
 
An introduction to Erlang and Elixir
An introduction to Erlang and ElixirAn introduction to Erlang and Elixir
An introduction to Erlang and Elixir
 
Programación funcional con haskell
Programación funcional con haskellProgramación funcional con haskell
Programación funcional con haskell
 
Scala: Simplifying Development
Scala: Simplifying DevelopmentScala: Simplifying Development
Scala: Simplifying Development
 
Java 8 to the rescue!?
Java 8 to the rescue!?Java 8 to the rescue!?
Java 8 to the rescue!?
 
JavaZone 2013 - Datomic vs EventStore
JavaZone 2013 - Datomic vs EventStoreJavaZone 2013 - Datomic vs EventStore
JavaZone 2013 - Datomic vs EventStore
 
The Not Java That's Not Scala
The Not Java That's Not ScalaThe Not Java That's Not Scala
The Not Java That's Not Scala
 
The Shape of Functional Programming
The Shape of Functional ProgrammingThe Shape of Functional Programming
The Shape of Functional Programming
 
Scala 101
Scala 101Scala 101
Scala 101
 
University of arizona mobile matters - technology, a means to an end
University of arizona   mobile matters - technology, a means to an endUniversity of arizona   mobile matters - technology, a means to an end
University of arizona mobile matters - technology, a means to an end
 
Building Cordova plugins for iOS
Building Cordova plugins for iOSBuilding Cordova plugins for iOS
Building Cordova plugins for iOS
 
Groovy Ast Transformations (greach)
Groovy Ast Transformations (greach)Groovy Ast Transformations (greach)
Groovy Ast Transformations (greach)
 
And the Greatest of These Is ... Space
And the Greatest of These Is ... SpaceAnd the Greatest of These Is ... Space
And the Greatest of These Is ... Space
 
Securing Client Side Data
 Securing Client Side Data Securing Client Side Data
Securing Client Side Data
 
An introduction to Ember.js
An introduction to Ember.jsAn introduction to Ember.js
An introduction to Ember.js
 
Scala @ TomTom
Scala @ TomTomScala @ TomTom
Scala @ TomTom
 
The Future of JVM Languages
The Future of JVM Languages The Future of JVM Languages
The Future of JVM Languages
 

Dernier

TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...apidays
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Zilliz
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodJuan lago vázquez
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelDeepika Singh
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWERMadyBayot
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesrafiqahmad00786416
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Angeliki Cooney
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...apidays
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusZilliz
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Jeffrey Haguewood
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businesspanagenda
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdfSandro Moreira
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityWSO2
 

Dernier (20)

TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 

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