Funkcionální programování a Clojure

Funkcionální programování a Clojure

Prezentace k přednášce o Funkcionálním programování a Clojure pro GDG Hradec Králové

Odkazy
Interaktivní dokumentace - http://conj.io/
Online Koans - http://www.4clojure.com/
Implementace funkce partition - https://github.com/clojure/clojure/blob/clojure-1.6.0/src/clj/clojure/core.clj#L2897
Cestování v čase pomocí atomů - https://swannodette.github.io/2013/12/31/time-travel/
Interaktivní tutorial pro CLJS v LightTable - https://github.com/swannodette/lt-cljs-tutorial
Záznam - https://www.youtube.com/watch?v=E61Er0u5GLU

428a9c6e5b151e618d4db288105bc5f3?s=128

Aleš Roubíček

January 29, 2015
Tweet

Transcript

  1. 2.
  2. 3.
  3. 4.
  4. 5.
  5. 7.

    Typy string "foo" character \f integer 42, 42N floating point

    3.14, 3.14M boolean true nil nil symbol foo, + keyword :foo, ::foo
  6. 8.

    Datové struktury list sequential (1 2 3) vector sequential, random

    access [1 2 3] map associative {:a 1 :b 2} set membership #{:a :b :c}
  7. 13.

    Definice funkce (defn greet "Returns a friendly greeting" [your-name] (str

    "Hello, " your-name)) function name doc string paramters function body
  8. 14.

    Definice funkce (defn greet "Returns a friendly greeting" [your-name] (str

    "Hello, " your-name)) list symbol symbol string vector symbol list symbol string symbol
  9. 18.
  10. 19.

    public <T> List<Pair<T, T>> toPairs(final Stream<T> s) { final AtomicInteger

    counter = new AtomicInteger(0); return s. collect(Collectors.groupingBy(item -> { final int i = counter.getAndIncrement(); return (i % 2 == 0) ? i : i - 1; })). values(). stream(). map(a -> new Pair<T, T>( a.get(0), (a.size() == 2 ? a.get(1) : null))). collect(Collectors.toList()); }
  11. 20.

    public <T> List<Pair<T, T>> toPairs(final Stream<T> s) { final AtomicInteger

    counter = new AtomicInteger(0); return s. collect(Collectors.groupingBy(item -> { final int i = counter.getAndIncrement(); return (i % 2 == 0) ? i : i - 1; })). values(). stream(). map(a -> new Pair<T, T>( a.get(0), (a.size() == 2 ? a.get(1) : null))). collect(Collectors.toList()); } WTF!?
  12. 21.
  13. 23.
  14. 25.

    (defn print-board [board] (println (s/reverse (s/join "\n" (map (fn [row]

    (s/reverse (s/join " " (map (fn [item] (case item :x "x" :o "o" :nothing "_")) row) ))) board)))))
  15. 27.

    Extract function refactoring (def item->str {:x "x" :o "o" nil

    "_"}) (defn row->str [row] (->> row (map item->str) (s/join " ") s/reverse)) (defn board->str [board] (->> board (map row->str) (s/join "\n") s/reverse))
  16. 29.

    Knihovny rozšiřují jazyk core.async - CSP jako v Go core.typed

    - statické typování jako v Haskellu core.match - pattern matching jako v Erlangu core.logic - logické programování jako v Prologu test.check - testování na základě vlastností - QuickCheck component - autonomní komponenty - IoC
  17. 30.

    Clojure • Praktický funkcionální jazyk • Dynamický, přesto silně typový

    • Jazyk na psaní mikrojazyků (DSLs) • Nové vlastnosti jazyka přidáváme pomocí knihoven (CSP, Pattern Matching, Prolog, Datalog…)
  18. 31.

    Funkcionální programování • Přímá manipulace s daty • Immutabilita usnadňuje

    uvažování i ve složitých případech • Kompozice z malých jednoduchých částí • Není to silver bullet, jen vhodný nástroj na určitou část problémů