Top Banner
Clojure for Java developers
80

Clojure for Java developers

Apr 13, 2017

Download

Technology

John Stevenson
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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