Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introduction à Clojure et Clojurescript - Capit...

Introduction à Clojure et Clojurescript - Capitole du Libre 2017

François Royer

November 18, 2017
Tweet

More Decks by François Royer

Other Decks in Programming

Transcript

  1. 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
  2. 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”
  3. “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
  4. La Bérézina du programmeur ... 100 000 lignes de JS

    et de nouvelles specs tous les jours... C’était irrécupérable.
  5. 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 ?
  6. 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]
  7. 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...
  8. 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?
  9. “It is better to have 100 functions operate on one

    data structure than 10 functions on 10 data structures.” Alan Perlis
  10. 4 5 2 3 0 1 6 7 6 7

    8 9 10 Immutabilité avec les structures persistantes
  11. 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
  12. 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”
  13. 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”
  14. 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)
  15. 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 ...
  16. ClojureScript est un compilateur pour Clojure ciblant JavaScript. Il émet

    du code JavaScript compatible avec le mode “advanced compilation” du compilateur Google Closure.
  17. Clojurescript dans le navigateur • Depuis 2013 • Permet de

    débugger directement CLJS sans lire le JS intermédiaire
  18. 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