cocktail d’expérience informatiques             Genève 3 & 4 octobre 2011                    Seconde édition              ...
Clojure Values                     Christophe Grand (@cgrand)                            SoftShake 2011jeudi 6 octobre 11
Ceci n’est pas une                       introductionjeudi 6 octobre 11
La non-introduction                            au langage                     • syntaxe                     • listes de fo...
Moi, je                     • Développeur indépendant                     • Contributeur Clojure                     • Co-...
Début 2008                     • Fin d’un projet traumatique                      • Asynchrone                      • Conc...
Mouton à 5 pattes                     • Langage dynamique                     • Programmation fonctionnelle               ...
Ça va couper !                     • Résigné à sacrifier une patte                      • Scala ?                      • Er...
Un nouvel espoir                     • Clojure                      • Quelques mois à peine (début 2008)                  ...
Clojure                     ✓Langage dynamique                     ✓Programmation fonctionnelle                     ✓Progr...
Sain et robuste                     • Un langage qui dit non, non, non...                      • On ne transige pas avec l...
Principe de réalité                 Respecter le principe de réalité consiste à                 prendre en compte les exig...
Principe de réalité (2)                     • JVM/CLR/JS                     • Impur aux entournures                     •...
Le coeur                     • Programmation fonctionnelle                     • Valeurs (immuables)                      ...
Persistance                     • Après mise à jour d’une collection,                       l’ancienne valeur de la collec...
Persistance (2)                     • Efficace                      • Pas de copies naïves                      • Partage d...
Prog. Fonctionnelle                     • Mauvais focus                      • Les données sont centrales                 ...
Data, data, data !                     • Inexorablement sortent du process :                      • disque, réseau, etc.  ...
Data, data, data ! (bis)                 Show me your code and conceal your data                 structures, and I shall c...
Données > Code                     • Le code (fonctions, méthodes) sérialise mal                      • beaucoup de contex...
Les données d’abord                     • Types de données simples :                      • entiers, décimaux, flottants, b...
Heureux les simples                     • Facilement sérialisable                     • Facilement mappable               ...
Avantages                     • Penser les données d’abord facilite le                       découplage                   ...
Inconvénients                     • Simples objets = pas de validation                     • La validation est ailleurs   ...
Séparation                     • En OO classique :                      • données et traitements mélangés dans            ...
interface = dialecte                     • nouvelles méthodes = nouveaux mots                     • généricité = mots comm...
Exemple                     • Le Web : massivement interopérable                     • Une seule interface de 8* méthodes ...
Moralité                     • Réutilisabilité = petites abstractions                       largement répanduesjeudi 6 oct...
Ça tombe bien...                      ...c’est ce que fait Clojure !jeudi 6 octobre 11
3 abstractions cœurs                     • La fonction                     • La collection                     • La séquen...
L’appel de fonction                     • Le «POST» de Clojure                      • peut tout faire                     ...
Les fonctions c’est pas                      que des fonctions !                     • Des collections aussi              ...
Et encore des fonctions !                     • Plusieurs niveaux de polymorphisme :                      • fonctions simp...
Polymorphismes                     • Méthodes de protocoles :                      • ±interfaces Java mais rétroadaptables...
3 abstractions cœurs                     • La fonction                     • La collection ⬅ Vous êtes ici                ...
Les collections                     • Comme en HTTP                      • beaucoup de méthodes : seq, conj,              ...
seq, conj, count                     • seq : séquence (itérateur en mieux) sur la                       collection        ...
Les maps sont des                     collections comme les autres                     • collection d’entrées (couple clé-...
Les objets sont des                     collections comme les autres                     • Records : classes customs, ±bea...
La preuve par l’exemple                      (defrecord Point [x y])                      (def p (->Point 0 1)) ; factory ...
3 abstractions cœurs                     • La fonction                     • La collection                     • La séquen...
Les séquences                     • Vue séquentielle                      • sur une collection                        • Su...
Exemples                 (seq [1 2 3 4])                 ⇒(1 2 3 4)                 (seq ”abc”)                 ⇒(”a” ”b” ...
Les séquences (2)                     • Interface de liste chaînée                      • premier et suivant (first & rest)...
À la demande                     • Évaluation paresseuse                      • vers l’infini et au delà !                 ...
Media de traitement                     • Intermédiaire de calcul                     • Résultat concret                  ...
En brefjeudi 6 octobre 11
Coder en Clojure                     • Données au centre                     • Abstraire avec parcimonie                  ...
soft-shake.ch - Clojure Values
Prochain SlideShare
Chargement dans…5
×

soft-shake.ch - Clojure Values

1 051 vues

Publié le

Christophe Grand


Une introduction à Clojure qui met l’accent sur la programmation par valeurs.

Sans elle, pas de programmes plus simples à “faire tenir dans sa tête”, pas de gestion saine des états et encore moins de programmation concurrente !


http://soft-shake.ch/2011/conference/sessions/java/2011/09/06/clojure.html

Publié dans : Technologie
  • Soyez le premier à commenter

soft-shake.ch - Clojure Values

  1. 1. cocktail d’expérience informatiques Genève 3 & 4 octobre 2011 Seconde édition soft-shake.chAuteur Christophe GRAND Track JavaSession Clojure Values
  2. 2. Clojure Values Christophe Grand (@cgrand) SoftShake 2011jeudi 6 octobre 11
  3. 3. Ceci n’est pas une introductionjeudi 6 octobre 11
  4. 4. La non-introduction au langage • syntaxe • listes de fonctions • gestion des états • interop Java • macros • valeurs/principes de Clojurejeudi 6 octobre 11
  5. 5. Moi, je • Développeur indépendant • Contributeur Clojure • Co-auteur de Clojure Programmingjeudi 6 octobre 11
  6. 6. Début 2008 • Fin d’un projet traumatique • Asynchrone • Concurrent • Rhino (JS/JVM) • Décidé à trouver un meilleur langagejeudi 6 octobre 11
  7. 7. Mouton à 5 pattes • Langage dynamique • Programmation fonctionnelle • Programmation concurrente • Méta-programmation • JVMjeudi 6 octobre 11
  8. 8. Ça va couper ! • Résigné à sacrifier une patte • Scala ? • Erlang ? • ...jeudi 6 octobre 11
  9. 9. Un nouvel espoir • Clojure • Quelques mois à peine (début 2008) • Déjà sain et robuste • Le coup de foudrejeudi 6 octobre 11
  10. 10. Clojure ✓Langage dynamique ✓Programmation fonctionnelle ✓Programmation concurrente ✓Méta-programmation ✓JVMjeudi 6 octobre 11
  11. 11. Sain et robuste • Un langage qui dit non, non, non... • On ne transige pas avec les principes !* *Y compris le principe de réalité :-) • Une implémentation Java «bizarre» • Style fonctionnel poussé • Facilement auditablejeudi 6 octobre 11
  12. 12. Principe de réalité Respecter le principe de réalité consiste à prendre en compte les exigences du monde réel, et les conséquences de ses actes. Le principe de réalité désigne avant tout la possibilité de sextraire de lhallucination, du rêve, dans lesquels triomphe le principe de plaisir et dadmettre lexistence dune réalité, insatisfaisante.jeudi 6 octobre 11
  13. 13. Principe de réalité (2) • JVM/CLR/JS • Impur aux entournures • Numériques • Pas de précision infinie par défaut • Mais pas de primitives qui débordent non plus • Laziness non-strictejeudi 6 octobre 11
  14. 14. Le coeur • Programmation fonctionnelle • Valeurs (immuables) • Structures de données persistantes* *pas dans le sens mémoire mortejeudi 6 octobre 11
  15. 15. Persistance • Après mise à jour d’une collection, l’ancienne valeur de la collection persiste • Deux objets collections : «avant» & «après» (def m {:a 1}) (assoc m :b 2) ⇒ {:a 1, :b 2} m ⇒ {:a 1}jeudi 6 octobre 11
  16. 16. Persistance (2) • Efficace • Pas de copies naïves • Partage de structure • Conseil de lecture (ou sa thèse)jeudi 6 octobre 11
  17. 17. Prog. Fonctionnelle • Mauvais focus • Les données sont centrales • Programmation orientée données ? orientée valeurs ?jeudi 6 octobre 11
  18. 18. Data, data, data ! • Inexorablement sortent du process : • disque, réseau, etc. • Espérance de vie supérieure au code • Transparentes • Structurantes pour le codejeudi 6 octobre 11
  19. 19. Data, data, data ! (bis) Show me your code and conceal your data structures, and I shall continue to be mystified. Show me your data structures, and I won’t usually need your code; it’ll be obvious. (Frederic Brooks modernisé par ESR)jeudi 6 octobre 11
  20. 20. Données > Code • Le code (fonctions, méthodes) sérialise mal • beaucoup de contexte (versions) • opacité • complexité d’implem des runtimes • sensibilité (fragilité) / détails d’implemjeudi 6 octobre 11
  21. 21. Les données d’abord • Types de données simples : • entiers, décimaux, flottants, booléen, identifiants, chaînes • Types de données composites : • listes, vecteurs, maps*, ensembles *aka hashmaps, hashtables, dictionnaires...jeudi 6 octobre 11
  22. 22. Heureux les simples • Facilement sérialisable • Facilement mappable • dans une BDD (SQL ou pas) • en JSON • etc. • Facilement testablejeudi 6 octobre 11
  23. 23. Avantages • Penser les données d’abord facilite le découplage • in-process : entre libs, entre modules • out-of-process : déjà vu • Pas de classes, pas de dépendances ! • Immutabilité : pas de conflit d’ownershipjeudi 6 octobre 11
  24. 24. Inconvénients • Simples objets = pas de validation • La validation est ailleurs • dans les traitements • via un «middleware» (un wrapper quoi) • en tant que pré et post-conditionsjeudi 6 octobre 11
  25. 25. Séparation • En OO classique : • données et traitements mélangés dans une classe • En Clojure : • les données sont «bêtes» • les traitements sont dans des fonctions • potentiellement polymorphiques !jeudi 6 octobre 11
  26. 26. interface = dialecte • nouvelles méthodes = nouveaux mots • généricité = mots communs • réutilisabilité ↗ = nb interfaces ↘jeudi 6 octobre 11
  27. 27. Exemple • Le Web : massivement interopérable • Une seule interface de 8* méthodes • Nul besoin d’implémenter les 8 pour bénéficier d’outils existants *5 + OPTIONS, TRACE, CONNECTjeudi 6 octobre 11
  28. 28. Moralité • Réutilisabilité = petites abstractions largement répanduesjeudi 6 octobre 11
  29. 29. Ça tombe bien... ...c’est ce que fait Clojure !jeudi 6 octobre 11
  30. 30. 3 abstractions cœurs • La fonction • La collection • La séquencejeudi 6 octobre 11
  31. 31. L’appel de fonction • Le «POST» de Clojure • peut tout faire • communique peu l’intention • Ok, ok, la parenthèse ouvrante est avant le nom de la fonction (f arg1 arg2) et non f(arg1, arg2)jeudi 6 octobre 11
  32. 32. Les fonctions c’est pas que des fonctions ! • Des collections aussi • ({"ch" "Suisse", "fr" "France"} "ch") ⇒ "Suisse" • (["a" "b" "c"] 2) ⇒ "c" • Des mots clés aussi • (:nom {:nom "Hickey", :prénom "Rich"}) ⇒ "Hickey"jeudi 6 octobre 11
  33. 33. Et encore des fonctions ! • Plusieurs niveaux de polymorphisme : • fonctions simples • méthodes de protocoles • multi-méthodes • predicate-dispatch (expérimental)jeudi 6 octobre 11
  34. 34. Polymorphismes • Méthodes de protocoles : • ±interfaces Java mais rétroadaptables • Multiméthodes : • dispatch sur tous les arguments • Predicate dispatch* • dispatch ouvert sur tous les arguments *Une simple librairiejeudi 6 octobre 11
  35. 35. 3 abstractions cœurs • La fonction • La collection ⬅ Vous êtes ici • La séquencejeudi 6 octobre 11
  36. 36. Les collections • Comme en HTTP • beaucoup de méthodes : seq, conj, count, disj, assoc, dissoc, get, nth, pop, peek • fréquences de support très différentesjeudi 6 octobre 11
  37. 37. seq, conj, count • seq : séquence (itérateur en mieux) sur la collection • conj : ajoute à la collection • count : renvoie le nb d’élémentsjeudi 6 octobre 11
  38. 38. Les maps sont des collections comme les autres • collection d’entrées (couple clé-valeur) (conj {:name "Soft-Shake.ch"} [:year 2011]) ⇒ {:name "Soft-Shake.ch", :year 2011} (seq {:name "Soft-Shake.ch", :year 2011}) ⇒ ([:name "Soft-Shake.ch"] [:year 2011]) • les entrées sont aussi des collections comme les autres...jeudi 6 octobre 11
  39. 39. Les objets sont des collections comme les autres • Records : classes customs, ±beans • Support de seq, count, conj, get, assoc, dissoc • Pas besoin d’API réflexive • Pas besoin de getters/settersjeudi 6 octobre 11
  40. 40. La preuve par l’exemple (defrecord Point [x y]) (def p (->Point 0 1)) ; factory par défaut (seq p) ⇒([:x 0] [:y 1]) (get p :y) ; ou (:y p) encore mieux ⇒1 (assoc p :x 2) ⇒#ch.soft_shake.Point{:x 2, :y 1}jeudi 6 octobre 11
  41. 41. 3 abstractions cœurs • La fonction • La collection • La séquence ⬅ Vous êtes ici jeudi 6 octobre 11
  42. 42. Les séquences • Vue séquentielle • sur une collection • Substituts aux itérateurs (en mieux) • sur un traitement • mort aux boucles ! • Un air de pipe unixjeudi 6 octobre 11
  43. 43. Exemples (seq [1 2 3 4]) ⇒(1 2 3 4) (seq ”abc”) ⇒(”a” ”b” ”c”) (map inc [1 2 3]) ⇒(2 3 4) (->> (range 10) (map #(* % 3)) (filter odd?)) ⇒(3 9 15 21 27)jeudi 6 octobre 11
  44. 44. Les séquences (2) • Interface de liste chaînée • premier et suivant (first & rest) • Constructible • pas besoin de commons.collections.iterators ou Guava’s Iterators ou... • Des collections comme les autresjeudi 6 octobre 11
  45. 45. À la demande • Évaluation paresseuse • vers l’infini et au delà ! • traitement de gros volumes • pas pour le contrôle d’exécutionjeudi 6 octobre 11
  46. 46. Media de traitement • Intermédiaire de calcul • Résultat concret • Type «strict» (non paresseux) • Effet de bord • Concrétisation met la machine en branlejeudi 6 octobre 11
  47. 47. En brefjeudi 6 octobre 11
  48. 48. Coder en Clojure • Données au centre • Abstraire avec parcimonie • Connaitre les 3 abstractions essentielles • Changer ses habitudes • Exercices avec une main dans le dosjeudi 6 octobre 11

×