Личный взгляд на Clojure

16
Clojure Личный взгляд

Transcript of Личный взгляд на Clojure

ClojureЛичный взгляд

Срыв покровов

— Это не тот Common Lisp

— Разница культур

— Это очень мощный и выразительный язык...

— ...подкрепленный Лиспом

— Скобочки не только круглые )))

Основное

— Работа с коллекциями

— Неизменяемость

— Транзакционная память

— Типы там, где они нужны

Все, что есть в ООП

— Расширение протоколов

— Паттерн-матчинг

— Ссылочные объекты

ClojureScript

— Компилируется в JS

— Модульность, неймспейсы, макросы

— Повторное использование кода Clojure

— Om — биндинг к React

Свобода действий

— Макросы

— свой DSL, например, ORM

— работа с деревьями (XML, HTML)

— многопоточность

ORM DSL example

(-> (select :*) (from :users) (where '(= id 5) '(= status "active")) sql/format)

Еще о макросах

(/ (* 2 (+ 2 3)) 100)(expr (2 + 3) * 2 / 100)

(for [item some-seq] (* item 2))

(-> initial func1 func2 func3)

IDE

— Емакс (trollface)

— Light Table

— Idea plugin

— Cursive IDE

Гомогенность

— Ring — призводительный веб-фреймворк

— приложение это функция (app request)

— добавили роутинг — получили функцию

— добавили мидлварь — получили функцию

— и тд.

Разве можно ничего не менять?(defn wrap-user [view] (fn [request] (view (assoc request :user (when-let [user-id (-> request :session :user-id)] (get-user-by-id user-id))))))

(def app (-> app-routes auth/wrap-user))

Не надо про скобочки!

— Они теперь разные

(function($){$('.foo').click(function() {alert(123);})})(jQuery); — 18 шт

Лисп упрощает сам себя

(get (get (get response :data) :user) :name)

(getin response [:data :user :name])

(-> response :data :user :name)

Pros

— библиотеки

— простота

— uberjar: деплой, дистрибуция, кроссплатформенность

— свобода

— производительность

— Google for "awesome-clojure"

Cons

— непривычно!

— для серьезной разработки нужен Емакс

— (пока еще) мало вакансий

— ограничения Java-платформы

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