21

Леонид Шевцов «Clojure в деле»

  • Upload
    dataart

  • View
    212

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Леонид Шевцов «Clojure в деле»
Page 2: Леонид Шевцов «Clojure в деле»

Спикер:

Тема:

Леонид  Шевцов

Clojure  в  деле

Page 3: Леонид Шевцов «Clojure в деле»

(def (apply ))

Page 4: Леонид Шевцов «Clojure в деле»

(defn project-point-to-line-fraction

"Projection of point on line (returns a real number; 0 = point is closest to v;

1 = point is closest to w; 1>f>0 - on the [v;w] segment; otherwise not on

the [v;w] segment). Returns 0 if v and w is the same point"

[point [v w]]

(let [length2 (dist2 v w)]

(if (< length2 0.00001) ; a point

0

(/ (+ (* (- (:x point) (:x v)) (- (:x w) (:x v)))

(* (- (:y point) (:y v)) (- (:y w) (:y v))))

length2))))

Page 5: Леонид Шевцов «Clojure в деле»

ФункцияДанные Результат

Функция Функция

Функция Функция

Слой абстракции

Page 6: Леонид Шевцов «Clojure в деле»

Волшебные структуры данных

Иммутабельные, разделяющие память, ленивые

Page 7: Леонид Шевцов «Clojure в деле»

Ленивая быстрая сортировка

Page 8: Леонид Шевцов «Clojure в деле»

Удобная работа с функциями

Создавать, передавать как параметры, изменять

(map #(if %1 %2 %3) conditions xs ys)

((partial perform-calculation config)

(-> x x-to-y y-to-z)

Page 9: Леонид Шевцов «Clojure в деле»

Стандартная библиотека

(defn points-to-segments "Convert a polyline represented by points into a vector of segments" [points] (into [] (partition 2 1 points)))

Page 10: Леонид Шевцов «Clojure в деле»

Несравненная расширяемость

DSL, DRY

Page 11: Леонид Шевцов «Clojure в деле»

Встроенная поддержка многопоточности

Атомы, транзакции, агенты

Page 12: Леонид Шевцов «Clojure в деле»

TDD, ReplDD

Page 13: Леонид Шевцов «Clojure в деле»

(facts

"about expr-transform"

(fact

"transforms expressions"

(algebra/expr-transform [:not [:and "x" "y"]]

[:or [:not "x"] [:not "y"]]

(algebra/expr :not [:and "a" "b"]))

=> (algebra/expr :or [:not "a"] [:not "b"])

(algebra/expr-transform [:not [:not "x"]]

"x"

(algebra/expr :not [:not "x"]))

=> "x")

Page 14: Леонид Шевцов «Clojure в деле»

Среда разработкиCursive (Intellij IDEA)

Page 15: Леонид Шевцов «Clojure в деле»

ДеплойHeroku, Apache, Docker

Page 16: Леонид Шевцов «Clojure в деле»

Библиотеки

Page 17: Леонид Шевцов «Clojure в деле»

(ns jsfp.parser (:require [clojure.string :as s]) (:import (org.antlr.v4.runtime ANTLRInputStream CommonTokenStream BailErrorStrategy) (org.antlr.v4.runtime.tree ParseTree) (jsfp ImperativeLanguageLexer ImperativeLanguageParser)))

(defn antlr-parse [source-code] (let [lexer (ImperativeLanguageLexer. (ANTLRInputStream. source-code)) tokens (CommonTokenStream. lexer) parser (ImperativeLanguageParser. tokens) proving-structure (.provingStructure parser)] (if (zero? (.getNumberOfSyntaxErrors parser)) proving-structure nil)))

Page 18: Леонид Шевцов «Clojure в деле»

ClojureScript, Om

Page 19: Леонид Шевцов «Clojure в деле»

Самое страшное(defn expr-match "Attempts to match expression by a pattern. Pattern is a structure of [operator param1 [operator param2 param3]... String params in pattern are matched against any sub-expression, identifier or primitive Boolean and numeric params in pattern are matched by equality. Returns a map of string params to their values, or false if there is no match" [pattern expression] (if (identifier? pattern) {pattern expression} (if (primitive? pattern) (and (= expression pattern) {}) (and (expr? expression) (let [operator (first pattern) params (next pattern)] (and (= operator (:operator expression)) (let [forward-param-bindings (map expr-match params (:params expression)) forward-match (not-any? false? forward-param-bindings) reverse-param-bindings (and (not forward-match) (expr-commutative? expression) (map expr-match params (reverse (:params expression)))) reverse-match (and reverse-param-bindings (not-any? false? reverse-param-bindings)) param-bindings (or (and forward-match forward-param-bindings) (and reverse-match reverse-param-bindings))] (and param-bindings (merge-bindings param-bindings)))))))))

Page 20: Леонид Шевцов «Clojure в деле»
Page 21: Леонид Шевцов «Clojure в деле»

Спасибо! Вопросы?

Леонид Шевцов

Web: http://L-S.me

GitHub: @leonid-shevtsov

)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))