Slide 1

Slide 1 text

Introduction à Clojure et Clojurescript François Royer [email protected] + special thanks à Arnaud Bos @francoisroyer

Slide 2

Slide 2 text

https://www.meetup.com/fr-FR/Toulouse-Clojure-User-Group/

Slide 3

Slide 3 text

Fiche d’identité du langage ● Un projet initié en 2007 ● Licence Eclipse ● Développement open sur Github https://github.com/clojure/clojure ● Lead designer: Rich Hickey ● Cible la JVM (clj) et JS (cljs) ● Un seul Jar pour commencer: java -cp clojure-${VERSION}.jar clojure.main

Slide 4

Slide 4 text

Un langage multi plate-forme

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

Pourquoi essayer ou adopter Clojure?

Slide 7

Slide 7 text

Le cycle de LISP ...

Slide 8

Slide 8 text

Eric Raymond aka ESR “LISP is worth learning for a different reason: the profound enlightenment experience you will have when you finally get it. That experience will make you a better programmer for the rest of your days, even if you never actually use LISP itself a lot.“ Eric Raymond “How to Become a Hacker”

Slide 9

Slide 9 text

“LISP has jokingly been described as "the most intelligent way to misuse a computer". I think that description a great compliment because it transmits the full flavour of liberation: it has assisted a number of our most gifted fellow humans in thinking previously impossible thoughts.” Edsger W. Dijkstra

Slide 10

Slide 10 text

Clojure est une réponse aux problèmes fondamentaux du dev logiciel

Slide 11

Slide 11 text

La Bérézina du programmeur ... 100 000 lignes de JS et de nouvelles specs tous les jours... C’était irrécupérable.

Slide 12

Slide 12 text

Problème Simplification Code spaghetti Programmation Orientée Objet, fonctionnelle... Gestion de la mémoire Garbage collection Effets de bord Fonctions pures Partage de données Passage de message Données immutables Concurrence / verrous Software Transactional Memory Passage de message Verrouillage offline, … Composabilité Fonctions de haut niveau Limitations des langages ex-même Macros DSLs, Design patterns … mais quelles solutions ?

Slide 13

Slide 13 text

Un langage concis (vs Java)

Slide 14

Slide 14 text

Un langage concis (vs JS)

Slide 15

Slide 15 text

Syntaxe

Slide 16

Slide 16 text

Une seule syntaxe pour réunir débutants et pros ...

Slide 17

Slide 17 text

Des fonctions qui ne demandent qu’à être composées

Slide 18

Slide 18 text

Un langage core avec peu de primitives ... Booléen true, false Caractère \a Keywork :doc Liste ‘(1 2 3) Dictionnaire { :name “Bill”, :age 42 } Valeur nulle nil Ensemble #{:foo :bar :baz} Chaîne “hello world” Vecteur [1 2 3]

Slide 19

Slide 19 text

… et rien à cacher :)

Slide 20

Slide 20 text

Clojure + listes = ● Une liste est une collection de valeurs homogènes ou hétérogènes ● Appliquer une fonction à une liste ne la modifie pas, mais renvoie une nouvelle copie de la liste originelle ● L’immutabilité des structures de données est une fondation de Clojure ● Deux opérateurs fondamentaux pour travailler les listes: first, rest ● Toutes les structures de données et fonctions en LISP peuvent être construites par la composition de ces deux opérateurs...

Slide 21

Slide 21 text

Listes

Slide 22

Slide 22 text

Composition

Slide 23

Slide 23 text

Back to the future avec Map, Filter & Reduce

Slide 24

Slide 24 text

Exemple: somme des carrés de nombres impairs ● Peux-t’on améliorer la maintenabilité de ce snippet? ● Que faire si la donnée provient d’un stream infini?

Slide 25

Slide 25 text

Version fonctionnelle avec Clojure

Slide 26

Slide 26 text

Version fonctionnelle avec Clojure

Slide 27

Slide 27 text

Destructuration

Slide 28

Slide 28 text

Destructuration des paramètres d’une fonction

Slide 29

Slide 29 text

Hashmaps

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

“It is better to have 100 functions operate on one data structure than 10 functions on 10 data structures.” Alan Perlis

Slide 32

Slide 32 text

Immutabilité

Slide 33

Slide 33 text

4 5 2 3 0 1 6 7 6 7 8 9 10 Immutabilité avec les structures persistantes

Slide 34

Slide 34 text

Boucles et récursions

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

Transactions et concurrence

Slide 37

Slide 37 text

Multi-threading Clojure réutilise les threads JVM pour construire des applications concurrentes

Slide 38

Slide 38 text

Les Refs pour aider à la programmation concurrente ● Clojure propose des références mutables à des valeurs immutables ● Pour lire le contenu d’une référence, on doit explicitement la déréférencer

Slide 39

Slide 39 text

Software Transactional Memory ● Un mécanisme transactionnel permet de garantir qu’aucun Thread ne peut observer yesterday dans l’état “Monday”, alors que today est encore à “Monday”

Slide 40

Slide 40 text

Go routines! ● Clojure propose une implémentation des CSP (Communicating Sequential Processes) avec la lib core.async ● Permet des patterns équivalents aux go routines de GO ● Disponibles sur la JVM et Javascript ● Evite le “callback hell”

Slide 41

Slide 41 text

Interopérabilité

Slide 42

Slide 42 text

Interopérabilité avec Java

Slide 43

Slide 43 text

Gestion des exceptions calquée sur le modèle Java

Slide 44

Slide 44 text

Outillage pour le développeur

Slide 45

Slide 45 text

GOOD DEV EXPERIENCE (defproject leiningen.org "1.0.0" :description "Generate static HTML for https://leiningen.org" :dependencies [[enlive "1.0.1"] [cheshire "4.0.0"] ] :main leiningen.web)

Slide 46

Slide 46 text

D’où vient la complexité d’une app web? ● Request handler ● Routing ● Database handler ● Templating ● ... THE CLOJURE WAY: Think (composable) LIBRARIES, not FRAMEWORKS Ring, Compojure, Hiccup ...

Slide 47

Slide 47 text

Clojure dans le navigateur avec Clojurescript

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

ClojureScript est un compilateur pour Clojure ciblant JavaScript. Il émet du code JavaScript compatible avec le mode “advanced compilation” du compilateur Google Closure.

Slide 50

Slide 50 text

Clojurescript dans le navigateur ● Depuis 2013 ● Permet de débugger directement CLJS sans lire le JS intermédiaire

Slide 51

Slide 51 text

Clojurescript vs Javascript

Slide 52

Slide 52 text

Clojurescript vs Javascript

Slide 53

Slide 53 text

Pour les intéressés: CLJS + React = Reagent

Slide 54

Slide 54 text

Pour les intéressés: CLJS + React + Flux = Re-frame

Slide 55

Slide 55 text

No content

Slide 56

Slide 56 text

A conversation with Alan Kay: http://queue.acm.org/detail.cfm?id=1039523 LISP 1.5 Programmer’s Manual: http://www.softwarepreservation.org/projects/LISP/book/LISP%201.5%20Programmers%20Manual.pdf The implementation of LISP (John McCarthy 1996): http://www-formal.stanford.edu/jmc/history/lisp/node3.html Leibniz’s law: https://en.wikipedia.org/wiki/Identity_and_change#Leibniz.27s_solution Identity Over Time (Andre Gallois, Stanford 2005): https://plato.stanford.edu/entries/identity-time/ Ideal Hash Trees (Phil Bagwell 2000): http://lampwww.epfl.ch/papers/idealhashtrees.pdf Are We There Yet? (Rich Hickey 2009): https://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey Clojure: https://clojure.org/ Clojure By Example: https://kimh.github.io/clojure-by-example/ ClojureScript: https://clojurescript.org/ CQRS (Martin Fowler 2011): https://martinfowler.com/bliki/CQRS.html Re-frame: https://github.com/Day8/re-frame