Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

Verliebt in Clojure

Verliebt in Clojure

Jens Bendisposto

April 26, 2018
Tweet

More Decks by Jens Bendisposto

Other Decks in Technology

Transcript

  1. Über mich • Heinrich Heine Universität • Leidenschaftlicher Softwareentwickler •

    rheinjug • Clojure Meetup Düsseldorf • Lambda Meetup Düsseldorf • EntwickelBar Unconference (nächste Ausgabe: 26.5)
  2. Viel wichtiger: Clojure ist ... • funktional • dynamisch typisiert

    • auf der JVM gehostet • ein Lisp Dialekt
  3. Geschichte von Clojure • Öffentliches Release: Okt. 2007 • Aktuelle

    Version 1.9 • Development: 1.10.0-alpha4 • Extrem seriöse Entwicklung • Nicht "der neuste heisse Scheiss" • Gedacht für professionelle Softwareentwicklung in Unternehmen • Trotzdem nicht langweilig! Rich Hickey
  4. – Neal Ford “People ask me what projects I would

    choose Clojure for. The answer is: the nastiest, hardest, toughest kinds of projects possible. Because it's those projects where you need the ability to mold your language towards your problem, not vice versa”
  5. Agenda* • Funktionen höherer Ordnung (HOF) • Datenzentrierung und Simplicity

    • Die JVM als Host • Clojure-Syntax * "Make the plan, execute the plan, expect the plan to go off the rails . . . Throw away the plan." 
 (Leonard Snart aka. Captain Cold)
  6. filter b r b r y g map b r

    b r y g reduce "brbryg" Die drei Amigos ...
  7. Übung Gegeben eine Collection ns von Zahlen • Berechne die

    Summe • der Quadrate • der ersten k • geraden Zahlen, • die grösser sind als 5 ns = [10,11,12,17,14,2,20,12], k = 4 840 ns = [10,11,12,17,14,2,20,12], k = 8 984 Inspririert durch Venkat Subramaniam * Falls es weniger als k passende Zahlen gibt, nimm alle
  8. Beweisstück A public static int compute(List<Integer> ns, int k) {

    int result = 0; int found = 0; for (int i = 0; (i < ns.size() && found < k); i++) { int v = ns.get(i); if (v > 5 && v % 2 == 0) { result += v * v; found++; } } return result; } Ist das Programm korrekt?
  9. Beweisstück B public static int compute(List<Integer> ns, int k) {

    return ns.stream() .filter(x -> x % 2 == 0) // die gerade sind .filter(x -> x > 5) // der Zahlen > 5, .mapToInt(x -> x * x) // Quadrate .limit(k) // der ersten k .sum(); // Berechne die Summe } Wie sieht es mit diesem Code aus?
  10. Funktionaler Code • Trennung von Fachlogik und technischem Code •

    Abstraktion mit Hilfe von Funktionen höherer Ordnung • Geht auch in Java!
  11. Datenzentrierung • Beschreiben von Informationen mit Hilfe von generischen unveränderlichen

    Datenstrukturen • In Clojure ist es idiomatisch eine Map an Stelle von Objekten zu verwenden • Daten werden geholt, transformiert, aggregiert, gespeichert, verschickt, durchsucht, ...
  12. Datenzentrierung • Überschaubare Anzahl generischer Datenstrukturen • Viele* Funktionen, die

    auf den Datenstrukturen operieren • Eine meiner Lieblingsfunktionen: frequencies • Für mich funktioniert Datenzentrierung sehr gut * Größenordnung: 100 Funktionen in der Standardbibliothek
  13. Simple vs. Easy • Simple vs. easy (Rich Hickey) •

    Simple ist eine objektive Eigenschaft des Codes • Easy ist ein subjektives Empfinden • Simple vs. familiar (Venkat Subramaniam)
  14. Complected Code • Funktionen/Methoden, Klassen, Komponenten, die complected sind, kann

    man nicht gut ändern • Permanentes Nachdenken über so viel Kontext • In OOP gibt es Prinzipien und Techniken zur Vermeidung von complecting • SOLID, GRASP, HCLC • TDD
  15. „Gleich mit jedem Regengusse Ändert sich dein holdes Tal, Ach,

    und in dem selben Flusse Schwimmst du nicht zum zweitenmal.“
 Johann Wolfgang von Goethe
  16. Anforderungen an ein gutes Zeitmodell • Atomare Abfolge von Zuständen,

    es gibt keine sichtbaren Zwischenzustände • Muss mehrere Zeitlinien (aka Threads) unterstützen • Lock-freie Lesezugriffe
  17. Eine Instanz: Das Atom v1 v2 v3 f g g

    Compare and Swap Semantik Achtung: Funktionen mit Seiteneffekten sind problematisch!
  18. Nebenläufigkeit! • Ein Clojure Atom garantiert, dass es niemals Race

    Conditions oder Deadlocks gibt • Leser werden nicht blockiert
  19. Designed to be hosted • Kein Versuch die Plattform zu

    abstrahieren, die Plattform ist Teil der Sprache und der Kultur • Clojure generiert Bytecode für die JVM • Java aufzurufen ist in Clojure trivial
  20. Keine Lisp Insel • Wir haben das ganze JVM Ökosystem

    zur Verfügung • Es ist vollkommen idiomatisch Java aus Clojure aufzurufen • Es gibt hervorragende Clojure Wrapper für Java Bibliothekten • Clojure kann auch erben, Interfaces implementieren, ...
  21. “The Clojure user [...] will run crying to Java for

    help, rather than implementing the feature himself correctly – that is, as a natural part of the entire language [...]. Clojure pisses on everything I’ve ever loved about Lisp [...] Clojure is the False Lisp [...] A Lisp which barfs Java stack traces.” – Stanislav Datskovskiy (http://www.loper-os.org/?p=42)
  22. Syntax (atomar) Zahlen 42, 3.1415, 1/4 Strings "Hallo JavaLand" Null

    nil Keywords :firstname, :email Symbols foo, +, play!, kebap-case-name Zeichen \a, \n, \newline, \space reguläre Ausdrücke #"[0-9]{3}" Clojure benutzt Java Klassen (vs. Jython/JRuby)
  23. Lists (:a :b :c) (+ 3 4 5) (1, 2,

    3) Vectors [1 2 3] [a 20 :b "foo"] Sets #{1, 2, 3} Maps {:firstname "Jens", :lastname "Bendisposto", :mails []} Alles heterogen und schachtelbar! Syntax (zusammengesetzt)
  24. (defn square [x] (* x x)) (def numbers (range 10))

    A taste of Clojure function square(x) { return x*x } // JS
  25. (defn square [x] (* x x)) (def squares (map square

    numbers)) (def numbers (range 10)) A taste of Clojure squares = numbers.map { it * it } //Groovy
  26. (defn square [x] (* x x)) (def squares (map square

    numbers)) (def numbers (range 10)) (println (filter even? squares)) A taste of Clojure print(squares.filter(x=> x % 2 == 0)) // JS
  27. Jens, sei mal ehrlich ... • Wie kann man diese

    Klammern mögen? • Das Ausbalancieren würde mich wahnsinnig machen!
  28. Paredit • In Lisp Editoren schreibt man keinen Programmtext •

    Man manipuliert eine Datenstruktur • Erfordert zwei Tage Gewöhnungszeit* • Danach vermisst man es in Java * mit viel Fluchen
  29. Fizz Buzz (defn div? [a b] (= 0 (mod a

    b))) (defn fizz-buzz-transform [e] (cond (div? e 15) :fizz-buzz (div? e 5) :buzz (div? e 3) :fizz true e)) (defn fizzbuzz [n] (map fizz-buzz-transform (range 1 (inc n))))
  30. Keine Zeit ... • Persistent Data-Structures • ClojureScript • Parallele

    Verarbeitung • Makros • Asynchrone Programmierung (à la CSP/Go) • Polymorphismus • Clojure Specs und Generatives Testen • ...
  31. Warum ich Clojure liebe • Ich habe keine Angst mehr

    vor Nebenläufigkeit • Datenzentrierung finde ich einleuchtend • Die Clojure Bibliothek ist toll • Der interaktive Entwicklungsstil liegt mir • Simplicity passt zu meiner Denkweise • OMG Funktionale Programmierung !!!! • Ich habe keine Angst vor Änderungen • Ich kann Clojure vertrauen
  32. Mehr? • Clojure/ClojureScript lernen • https://www.maria.cloud/ • http://www.4clojure.com • http://clojurescriptkoans.com/

    • http://clojurekoans.com/ • YouTube: Talks von Rich Hickey und Stuart Halloway • Buch: Clojure for the Brave and True