http://bit.ly/2mainstream
Никита Прокопов из AboutEcho.com рассказывает о Clojure, 6 марта 2013
Эта лекция — часть курса «Немейнстримовые технологии разработки», читаемого в Новосибирском Государственном Университете
9. # Как это выглядит
public class StringUtils {
public static boolean isBlank(String str) {
int strLen;
if (str == null || (strLen = str.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if ((Character.isWhitespace(str.charAt(i)) == false)) {
return false;
}
}
return true;
}
}
10. # Как это выглядит
(defn blank? [s]
(every? #(Character/isWhitespace %) s))
11. # Как это выглядит
public class StringUtils {
public static boolean isBlank(String str) {
int strLen;
if (str == null || (strLen = str.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if ((Character.isWhitespace(str.charAt(i)) == false)) {
return false;
}
}
return true;
}
}
(defn blank? [s]
(every? #(Character/isWhitespace %) s))
12. # Синтаксис
method() (f)
method(arg) (f arg)
object.method(arg) (f object arg), (.method o a)
Map<String, String> map = (def map {:key “value”})
new HashMap<String, String>();
map.put(“key”, “value”);
14. # Философия
См. youtube.com/clojuretv
Особенно (!) Rich Hickey
15. # Открывайте данные
Программы перемалывают данные
Не прячьте их
“It is better to have
100 functions operate on
one data structure
than to have
10 functions operate on
10 data structures.”
16. # Открывайте данные
distinct filter remove for keep keep-indexed cons
concat lazy-cat mapcat cycle interleave interpose
rest next fnext nnext drop drop-while nthnext for
take take-nth take-while butlast drop-last for flat-
ten reverse sort sort-by shuffle split-at split-with
partition partition-all partition-by map pmap mapcat
for replace reductions map-indexed seque first ffirst
nfirst second nth when-first last rand-nth zipmap
into reduce set vec into-array to-array-2d frequen-
cies group-by apply not-empty some reduce seq? eve-
ry? not-every? not-any? empty? some filter doseq do-
run doall realized? seq vals keys rseq subseq rsubseq
lazy-seq repeatedly iterate repeat range line-seq
resultset-seq re-seq tree-seq file-seq xml-seq itera-
17. # Decomplecting
Var = value + time
Object = state + identity + value
Method = func + state + namespace
Actors = what + who
Loops = what + how
...
23. # Concurrency
## Проблемы
неатомарные операции
согласованное принятие решений
когерентное состояние мира
24. # Проблемы многопоточного
программирования
«Мир» постоянно меняется
Просадка скорости на syncs
Dead locks
Live locks
Легко ошибиться
Сложно просчитать варианты
Сложно тестировать
25. # Immutable data structures
Легко шарить между потоками
Операции атомарны по определению
Едят кучу памяти (медленно?)
26. # Persistent data structures
«Умно» делят общие части
Едят мало памяти
Быстрые
(почти константная стоимость)
Портированы в Scala :)
27. # List
list3 list2 list1
head head head
tail tail tail
1 2 3
49. # Atoms
Для «простого» mutable state
Явно выделенная «мутация»
Атомарное изменение
Любое значение — это всегда
результат последовательного
применения функций
61. # Agent
Unit of work
Похож на atoms, только…
Для последовательных операций:
heavy lifting, сохранение в файл, запись в сеть,
конечные автоматы, …
Выполняется в отдельном потоке
Очередь сообщений
Всегда наблюдаемое состояние
62. # STM
Согласованное изменение состояния
Проще рассуждать
Сложнее ошибиться
Composable
Агенты работают с STM!