1 of 26

ClojureScript для скептиков

2 of 26

Кто такие скептики?

  • Скептик — сторонник скептицизма. ¯\_(ツ)_/¯ (Wikipedia)
  • Человек, относящийся ко всему критически, с недоверием, во всем сомневающийся.

То есть, по-хорошему - это большинство программистов

2

3 of 26

Откуда скептицизм к любому новому языку?

  • Непривычно
  • Стандартная библиотека
  • Интеграция с платформой
  • Производительность
  • Инструменты
  • Сообщество
  • Кто использует

3

4 of 26

ClojureScript

5 of 26

Непривычно

  • LISP ))))))))))000, а точнее диалект/подмножество Clojure в JS
  • Пишем сразу в AST (или, если придираться в “S-expressions”)
  • Нету операторов, только функции (привет, Ruby... ну, почти)
  • Нету классов, только пространства имён
  • Нету объектов, только структуры данных
  • Те структуры данных что есть, не меняются

5

6 of 26

Скобочки не с той стороны

Программисты делают вид что они все такие рациональные и

серьёзные, но ревут как дети когда кто-то двигает их скобочки.

Плюсы которые не сразу очевидны:

  • Нету разделения на синтаксис и данные (всё данные)
  • Новые “языковые” фичи идут в виде библиотек (core.async)
  • Стабильный синтаксис

6

7 of 26

К скобочкам привыкаешь

  • Помимо скобочек синтаксис сосредоточен в примитивах
  • Скобочки разные
    • () - списки
    • [] - массивы
    • {} - (хеш)мапы
    • #{} - сеты
  • Всё пишется с использованием этих структур
    • JS
    • CSS
    • HTML
    • Конфиги
    • Вообще всё

7

8 of 26

CSS (Garden)

[:.panel {

:max-height "100vh"

:flex "1"

}

[:&.active

[:.panel-container {

:outline (str "1px " theme-blue " solid")

:box-shadow shadow-for-active

}]

]

]

8

9 of 26

HTML (Reagent, Rum, Hiccup)

(defn simple-component []

[:div

[:p "I am a component!"]

[:p.someclass

"I have " [:strong "bold"]

[:span {:style {:color "red"}} " and red "]

"text."

]

])

9

10 of 26

Config (immuconf)

{

:database {

:uri "jdbc:postgresql://db-server.com:1234/my-database"

:user "system"

:password #immuconf/override "Specify the database password here.

Ask Jim if you don't have it."

}

}

10

11 of 26

(нытьё)Пример

12 of 26

12

13 of 26

13

14 of 26

14

15 of 26

Классовая борьба

Объекты:

  • Терпимы для процессов, но плохи для данных (ValueObject)
  • Они как марионетки − можно дёргать всё что “видно”

Классы:

  • Без data-members превращаются в обычные пространства имён
  • Наследование становится ненужным (композиция etc.)

Протоколы против анархии

  • По сути − интерфейсы
  • Например IFn для вызова функций
  • Лежат в основе структур данных

15

16 of 26

Структуры данных

  • Неизменяемые (вдохновили Immutable.js и mori)
  • Persistent
    • Шарят структуру
    • Вместо изменений возвращают новую версию
    • Старая версия остаётся полностью рабочей и доступной
    • Эффективны по памяти
  • Можно вкладывать друг в друга сколько нужно
  • Можно вызывать как функции
  • Часто используются в связке с примитивами для управления�состоянием (atom)

16

17 of 26

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

  • Тонны функций для работы с коллекциями и примитивами
  • lodash/underscore не нужны
  • CLJSJS
    • Врапперы + аннотации популярных JS библиотек
  • Google Closure

17

18 of 26

Google Closure (да, через “s”)

  • Используется в Google для всех веб-продуктов
  • Library
    • Работа с DOM (если вдруг надо)
    • События
    • AJAX
  • Compiler
    • ми(ми)нифицирует
    • Advanced режим топчет вообще всё
    • Ломает код если не уметь под него писать (пробовали скормить jQuery?)

18

19 of 26

А ClojureScript тут причём?

  • ClojureScript генерирует код, который годится для минификации в�Advanced режиме
    • Удаляет неиспользуемые функции
    • Распределяет функции по модулям
  • Позволяет разделять код на модули на основе пространств�имён
  • Изгоняет страх добавления в проект новых библиотек

19

20 of 26

Доступ к платформе

Не такой прямой в CoffeeScript или TypeScript из-за сильно отличающейся семантики

20

ClojureScript

JS

(.ClassName one two three)

new ClassName(one, two, three);

(new js/Date)

new Date();

(.now js/Date)

Date.now()

(.-hostname js/location)

location.hostname;

(set! (.-title js/document) "Hi!")

document.title = "Hi!";

21 of 26

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

  • Компилируется в ES3 (не опечатка) 2001 года,�который современные VM едят на завтрак
  • Persistent структуры быстры и эффективны по памяти
  • Использование “продвинутых” языковых возможностей не снижает производительность
  • Библиотеки оборачивающие React быстрее чем просто React

21

22 of 26

Инструменты

  • Редакторы
    • Cursive (IDEA), Emacs
    • (Atom или Visual Studio Code) + Parinfer
  • Сборка
    • Leiningen (более популярный и стабильный)
    • Boot (более хипстерский и новый)
  • Отладка
    • REPL (тысячи их)
    • Figwheel
    • Boot-reload
    • Source maps
    • (js/console.log something)

22

23 of 26

Сообщество

  • Много отвеченных вопросов на StackOverflow
  • clojurians.slack.com
  • CLJSJS
  • Куча докладов на конференциях
  • Является источником вдохновения для JS сообщества

23

24 of 26

Кто использует

~120 компаний на https://clojurescript.org/community/companies

  • CircleCI
  • Cisco
  • eBay
  • Rackspace

Минус в том, что не пишут где именно применяют

24

25 of 26

Крутые вещи чтобы заценить

  • Om / Om Next (как React + Redux + GraphQL)
  • Re-frame (как React + Redux)
    • Если нужно ещё полегче - есть Reagent и Rum
  • core.async (против callback hell со вкусом Go)
  • core.typed (аннотации типов а-ля Flow)
  • core.spec (как тесты + типизация + документация)
  • Planck (быстрый REPL для macOS и linux)
  • cljc для общего кода с Clojure

25

26 of 26

(println "Thanks!")

(def me {

:twitter "https://twitter.com/YurySoloviov"

:github "https://github.com/YurySolovyov"

:email "biohazard707@gmail.com"

})

26