fun with functional programming in clojure - john stevenson - codemotion amsterdam 2016

54
Get Functional Programming with Clojure by John Stevenson @jr0cket clojure.practical.li

Upload: codemotion

Post on 22-Jan-2018

544 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Get Functional Programming with Clojure

by John Stevenson @jr0cket clojure.practical.li

Page 2: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

@jr0cketSpeaker, author, conference organiser & community obsessed

developer.

Love Clojure, Emacs, Cats, Cycling & Agile development.

@Heroku @SalesforceDevs #Trailhead

In a galaxy far, far away… London, UK

www.practical.li

Page 3: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Why Functional Programmingit's not just because it's really fun...

Page 5: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

The Complexity Iceberg

- @krisajenkins

● complexity is very dangerous when hidden

● You can't know what a function does for certain if it has side effects

Page 6: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Side Effects

Page 7: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Pure FunctionsThe results of the function are purely determined by its initial output and its own code

- no external influence, a function only uses local values- referential transparency (the function can be replaced by its value)

Page 8: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Impure Functions - side causesThe results of the function are purely determined by its initial output and its own code

- behaviour externally influenced and non-deterministic

Page 9: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Eliminating Side Effects

Functional programming is about eliminating side effects where you can, controlling them where you can't - @krisajenkins

The features in Functional Programming come from a desire to reduce side effects

Page 10: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

ClojureGeneral purpose language hosted on JVM, JavaScript & CLR

Page 11: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Clojure / ClojureScript

A hosted language with simple interoperability with the host language

- (java.Util.Date.)- (js/alert “Client side apps are easier in Clojure”)

Page 12: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Clojure - basic syntax for this talk( ) ;; an empty list. The first element of a list is evaluated as a function call

(function-name data) ;; call a function with the data as its argument

(def name “data-or-value”) ;; assign (bind) a name to a data or legal value

:keyword-name ;; a keyword is a name that points to itself

;; Thread-first macro - chain function calls, passing the result of each call as the first argument to the next function. The ,,, indicates where the resulting argument goes.

(-> (function-a “data”) (function-b ,,,) ;; In Clojure commas , are whitespace (function-c ,,, “data”))

Page 13: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Persistent Data Structures - List, Vector, Map & SetClojure’s built-in data structures are all immutable- returning a new data structure when a function is applied

(list 1 2 3 4 5) ‘(“fish” “chips” 42)

(vec ‘(1 2 3 4)) [1 2 3 4]

{:key “value”} {:name “John” :skill “conferencing”}

(set ‘(1 2 3 4 4)) #{1 2 3 4}

Page 14: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Persistent Data Structures - shared memory

Each function creates a new vector

Memory space for values is shared between each vector

Page 15: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Persistent Data Structures - shared memory

By sharing memory you can apply functions over and over again effectively

Values persist until they are no longer referenced

Page 16: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Higher Order FunctionsFunctions always return a value & can be used as an argument to another function

Page 17: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Composing functions togetherExample: current value of the Clojure project from the configuration file- `slurp` in the project file, convert into a string and return the value at index 2

Page 18: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

PolymorphismFunctions evaluate different algorithms based on arity of arguments

Page 19: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Recursion & PolymorphismProcess a collection of values by feeding the remaining elements back to the function

- the sum function is polymorphic, it has different behaviours that could be evaluated depending on if passed 1 or 2 arguments

Page 20: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Recursion - tail call optomisationProtect the heap space from blowing by using the recur function

Using recur in the last line is the same as calling sum, however the memory required from the previous sum function call is over-written in memory. So only 1 memory slot is used instead of 10 billion

Page 21: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Lazy EvaluationOnly return a value when necessary

● maintain precision● optomise evaluation

Page 22: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Sequence / List Comprehension

Iterate over collections

Page 23: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Sequence / List Comprehension

Iterating through a range of generated values to create a list of 2 value vectors

Page 24: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Immutability - local binding

Assignments made locally are immutable

- words is a local binding to the result of running the function upper-case on “Hello World”

- letter->clack is a function that converts a character to a code

Page 25: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Concurrency is Easier

Concurrency is much easier to write and reason about because of

- Immutability by default- Persistent Data Structures- values are immutable- functional isolation & pure functions- state changes managed atomically (software transactional memory)- core.async library allows you to write asynchronous code as easily as sequential

code

Page 26: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Safe State changes

Changing state safely by not changing it

● Persistent data structures● Local bindings

Changing state safely by changing it atomically

● Software Transactional Memory (STM)○ Gives an mechanism like an in-memory atomic database that manages mutable state changes

under the covers

● Atoms● core.async

Page 27: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Concurrency syntax - atoms

An online card game has players that can join and have their winnings tracked

Page 28: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Concurrency syntax - atoms

The join-game function adds players to the atom by their name, but only up to 2 players

Page 29: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Concurrency syntax - refs for sync updatesThe join-game-safely adds players to the ref and alters their account & game account

Page 30: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Putting it all togetherLet's find all the most common words used in a popular Science Fiction novel

Page 31: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Tools to learn Clojureinspire them & build up their motivation

Page 32: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Clojure support in many different tools

Page 33: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Leiningen - Clojure powered build automation

Page 34: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016
Page 35: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

LightTable - Instarepl

Page 36: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Emacs & Spacemacs

Page 37: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Figwheel (flappy birds example)

Page 38: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016
Page 39: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Examples, examples, exampleswe learn by example...

Page 40: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Over 20 Books on Clojure...

Where to start with Clojure will be different...

Example:

I typically suggested BraveClojure.com as a starting point, however many people prefer LivingClojure or ClojureScript Unraveled...

Help people understand the relevance of a book and if it's the right thing for them at that time.

Page 41: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Clojure.org & ClojureDocs.org

Page 42: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016
Page 43: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Github

Page 44: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Clojure-through-code Git repository

Page 45: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

http://practical.li/clojure-webapps

Page 46: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016
Page 47: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Testing your Clojure skills...

Page 48: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016
Page 49: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Clojurian Community in Person

Probably the most active language-specific developer communities in London

Page 50: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Learning by teaching others

I really started thinking in Clojure when I started talking to & teaching others

- Coding dojos- talks on Clojure (starting with the basics, showing the art of the possible)- moving on to running conferences- workshops at hack days

Page 51: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Overtone live performance - MetaX

Page 52: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Overtone live performance - MetaX

Page 53: Fun with Functional Programming in Clojure - John Stevenson - Codemotion Amsterdam 2016

Take your own journey into Clojure