80
Clojure for Java developers

Clojure for Java developers

Embed Size (px)

Citation preview

Page 1: Clojure for Java developers

Clojure for

Java developers

Page 2: Clojure for Java developers

Assumptions

Some experience with Java development

Little or no experience with Clojure

You want to try something different!

Haskell, Erlang and

Scala seem hairy!

Page 3: Clojure for Java developers

Why Clojure ?

Page 4: Clojure for Java developers

Why get functional ?

4 cores in a typical developers Mac book Pro

How long until 128 cores in a laptop is common?

Page 5: Clojure for Java developers

Parallelism made simpler

Provides tools to create massively parallel applications

Not a panacea

Page 6: Clojure for Java developers

Think differently

Functional concepts

Changing state

Page 7: Clojure for Java developers

What is Clojure

Page 8: Clojure for Java developers

One of many JVM languages

JavaGroovyJRubyJythonScala

ClojureJaskell

Erjalang

Page 9: Clojure for Java developers

A little more ubiquitous

.Net framework – DLR/CLR

In browsers > ClojureScript

Native compilers

Page 10: Clojure for Java developers
Page 11: Clojure for Java developers

Very small syntax

( )[ ], { }

def, defn, defproject list, map, vector, set

let._

atom

Page 12: Clojure for Java developers

Mathematical concepts

Functions have a value

For a given set of arguments, you should always get the same

result(Referential transparency)

Page 13: Clojure for Java developers

Clojure concepts

Encourages Pure Functional approach

- use STM to change state

Functions as first class citizens

- functions as arguments as they return a value

Make JVM interoperation simple

- easy to use your existing Java applications

Page 14: Clojure for Java developers

A better Lisp !

Sensible () usage

Sensible macro names

JVM Interoperability

Lisp is the 2nd oldest programming language still in use

Page 15: Clojure for Java developers

Which LISP is your wingman ?Common Lisp Clojure

Page 16: Clojure for Java developers

Clojure is modular

Page 17: Clojure for Java developers
Page 18: Clojure for Java developers

Comparing Clojurewith Java

Page 19: Clojure for Java developers

The dark side of Clojure

( x )( x )

Page 20: Clojure for Java developers

The dark side of Clojure

( ( x ) )( ( x ) )

Page 21: Clojure for Java developers

The dark side of Clojure

( ( ( x ) ) )( ( ( x ) ) )

Page 22: Clojure for Java developers

The dark side of Clojure

( ( ( ( x ) ) ) )( ( ( ( x ) ) ) )

Page 23: Clojure for Java developers

The dark side of Clojure

( ( ( ( ( x ) ) ) ) )( ( ( ( ( x ) ) ) ) )

Page 24: Clojure for Java developers

() verses

{ () };

Clojure verses Java syntax

Page 25: Clojure for Java developers

([] (([]))) verses

{ ({([])}) };

Well actually more like....

Page 26: Clojure for Java developers
Page 27: Clojure for Java developers

Its all byte code in the end..

Any object in Clojure is just a regular java object

Types inherit from:

java.lang.object

Page 28: Clojure for Java developers

What class is that...

(class "Jr0cket")

=> java.lang.String

(class

(defn hello-world [name]

(str "Hello cruel world")))

=> clojure.lang.Var

Using (type …) you can discover either the metadata or class of something

Page 29: Clojure for Java developers

Prefix notation

3 + 4 + 5 – 6 / 3

(+ 3 4 5 (- (/ 6 3)))

Page 30: Clojure for Java developers

Java made simpler

// Java

import java.util.Date;{

Date currentDate = new Date();

}

; Clojure

(import java.util.Date)

(new Date)

Page 31: Clojure for Java developers

Ratio

Unique data type

Allow lazy evaluation

Avoid loss of precision

(/ 2 4)

(/ 2.0 4)

(/ 1 3)

(/ 1.0 3)

(class (/ 1 3)

Page 32: Clojure for Java developers

Prefix notation everywhere

(defn square-the-number [x]

(* x x))

Page 33: Clojure for Java developers

Defining a data structure

( def my-data-structure [ data ] )

( def days-of-the-week

[“Monday” “Tuesday” “Wednesday”])

You can dynamically redefine what the name binds to, but the vector is immutable

Page 34: Clojure for Java developers

Really simple data structure

(def jr0cket

{:first-name "John",

:last-name "Stevenson"})

Using a map to hold key-value pairs.

A good way to group data into a meaningful concept

Page 35: Clojure for Java developers

Defining simple data

(def name data)

Page 36: Clojure for Java developers

Calling Behaviour

(function-name data data)

Page 37: Clojure for Java developers

Immutable Data structures

Page 38: Clojure for Java developers

List – Ordered collection

(list 1 3 5 7)

'(1 3 5 7)

(quote (1 3 5 7))

(1 2 3) ; 1 is not a function

Page 39: Clojure for Java developers

Vectors – hashed ordered list

[:matrix-characters

[:neo :morpheus :trinity :smith]]

(first

[:neo :morpheus :trinity :smith])

(nth

[:matrix :babylon5 :firefly] 2)

(concat [:neo] [:trinity])

Page 40: Clojure for Java developers

Maps – unordered key/values

{:a 1 :b 2}

{:a 1, :b 2}

{ :a 1 :b }java.lang.ArrayIndexOutOfBoundsException: 3

{ :a 1 :b 2}

{:a 1, :b 2}

{:a {:a 1}}

{:a {:a 1}}

{{:a 1} :a}

{{:a 1} :a}; idiom - put :a on the left

Page 41: Clojure for Java developers

Lists are for codeand data

Vectors are for data and arguments

Its not that black and white, but its a useful starting point when learning

Page 42: Clojure for Java developers

Interacting With Java

Page 43: Clojure for Java developers

Joda Time(use 'clj-time.core)

(date-time 1986 10 14)

(hour (date-time 1986 10 14 22))

(from-time-zone (date-time 2012 10 17)

(time-zone-for-offset -8))

(after? (date-time 1986 10)

(date-time 1986 9))

(show-formatters)

Page 44: Clojure for Java developers
Page 45: Clojure for Java developers

Importing Java into Clojure

(ns drawing-demo

(:import [javax.swing Jpanel JFrame]

[java.awt Dimension]))

Page 46: Clojure for Java developers

Calling Java GUI

(javax.swing.JOptionPane/showMessageDialog nil "Hello Java Developers" )

Page 47: Clojure for Java developers

do makes swing easy

Page 48: Clojure for Java developers

Simplifying with doto

doto evaluates the first expression in a chain of expressions and saves it in a temporary variable. It then inserts that variable as the first argument in each of the following expressions. Finally, doto returns the value of the temporary variable.

Page 49: Clojure for Java developers

Working with Java

Java Classes ● fullstop after class name

(JFrame. )

(Math/cos 3) ; static method call

Java methods● fullstop before method name

(.getContentPane frame) ;;method name first

(. frame getContentPane) ;;object first

Page 50: Clojure for Java developers

Get coding !

Page 51: Clojure for Java developers

clojure.org

docs.clojure.org

Page 52: Clojure for Java developers

All hail the REPLAn interactive shell for clojure

Fast feedback loop for clojure

Page 53: Clojure for Java developers
Page 54: Clojure for Java developers
Page 55: Clojure for Java developers

Managing a Clojure project

Page 56: Clojure for Java developers

Maven

Just like any other Java project

Step 1)

Add Clojure library dependency to your POM

Step 2)

Download the Internet !!!

Page 57: Clojure for Java developers

Leiningen

lein new

lein deps

lein repl

lein jack-in

● Create a new Clojure project● Download all dependencies● Start the interactive shell (repl)● Start a REPL server

leiningen.org

Page 58: Clojure for Java developers
Page 59: Clojure for Java developers

Eclipse & Clojure = Counter Clockwise

Page 60: Clojure for Java developers

Emacs

Page 61: Clojure for Java developers
Page 62: Clojure for Java developers
Page 63: Clojure for Java developers

Light table

Kickstarter project to build a development environment, focused on the developer experience

Page 64: Clojure for Java developers
Page 65: Clojure for Java developers

Functional Web

Page 66: Clojure for Java developers

webnoir.org

Page 67: Clojure for Java developers

Clojure calling Java web stuff

(let [conn]

(doto (HttpUrlConnection. Url)

(.setRequestMethod “POST”)

(.setDoOutput true)

(.setInstaneFollowRedirects true))])

Page 68: Clojure for Java developers

Deploy Clojure to the Cloud

lein new heroku my-web-app

Page 69: Clojure for Java developers

Getting a little more functional

Page 70: Clojure for Java developers

Recursive functions

● Functions that call themselves

● Fractal coding

● Tail recursion● Avoids blowing the

stack

● A trick as the JVM does not support tail recursion directly :-(

Page 71: Clojure for Java developers

Recursion – managing memory

(defn recursive-counter [value]

(print value)

(if (< value 1000)

(recur (+ value 4))))

(recursive-counter 100)

Page 72: Clojure for Java developers

Mutable State

Page 73: Clojure for Java developers

Software Transactional MemoryProvides safe, concurrent access to memory

Agents allow encapsulated access to mutable resources

http://www.studiotonne.com/illustration/software-transactional-memory/

Page 74: Clojure for Java developers

Atoms - Coding state changes

; Clojure atom code

(def mouseposition (atom [0 0]))

(let [[mx my] @mouseposition])

(reset! mouseposition [x y])

Page 75: Clojure for Java developers

Database access

Clojure-contrib has sql library

Korma - "Tasty SQL for Clojure"

CongoMongo for MongoDB

https://devcenter.heroku.com/articles/clojure-web-application

Page 76: Clojure for Java developers

Getting Creative with Clojure

Page 77: Clojure for Java developers

Overtone: Music to your ears

Page 78: Clojure for Java developers

Where to find out more...

clojure.org/cheatsheet

Page 79: Clojure for Java developers

Hacking Clojure challenges

Page 80: Clojure for Java developers

Thank you

@jr0cket

London ClojuriansGoogle Group