Upload
john-stevenson
View
1.444
Download
4
Embed Size (px)
Citation preview
OO Softwarein actionJosh Smith - Tweet
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
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)
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
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
Clojure / ClojureScript
A hosted language with simple interoperability with the host language
- (java.Util.Date.)- (js/alert “Client side apps are easier in Clojure”)
Persistent Data Structures
(list 1 2 3 4 5) ‘(“fish” “chip” 42)
(vec ‘(1 2 3 4)) [1 2 3 4]
{:key “value} {:name “John” :skill “talking in full rooms”}
(set ‘(1 2 3 4 4)) #{1 2 3 4}
Higher Order FunctionsFunctions always return a value & can be used as an argument to another function
- Chain functions over a data structure
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
RecursionProcess a collection of values by feeding the remaining elements back to the function
- the sum function has different behaviour depending on if passed 1 or 2 arguments
Sequence / List Comprehension
Iterating through a range of generated values to create a list of 2 value vectors
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
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
Concurrency syntax - atoms
An online card game has players that can join and have their winnings tracked
Concurrency syntax - atoms
The join-game function adds players to the atom by their name, but only up to 2 players
Concurrency syntax - refs for sync updatesThe join-game-safely adds players to the ref and alters their account & game account
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.
Clojurian Community in Person
Probably the most active language-specific developer communities in London
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