SlideShare uma empresa Scribd logo
1 de 68
Baixar para ler offline
Clojure #1 
Introduction to clojure
Why Clojure? 
● For JVM with Java interoperability 
● Instant run/reloading 
● Functional 
● Lisp features (macros, expressive) 
● built-in STM 
● Dynamic 
● Good performance
Important tools 
● Leiningen - Clojure build tool 
● REPL, nREPL 
● Editors: IDEA (La Clojure, Cursive), Emacs, 
Light Table
Basics
Functions 
Очень простой синтаксис: 
(fn [] 
4)
Function call 
Любая функция вызывается в prefix 
нотации: 
(+ 1 1) 
В данном случае + это функция, а единицы 
это аргументы.
Expressions 
В Clojure, как практически и в Scala все 
является выражением, то есть возвращает 
значение: 
(if condition 
then-branch 
else-branch)
Literals 
● "a string" - String 
● :key - Keyword 
● 'symbol - Symbol 
● newline, c - Character 
● nil - No value 
● true, false - Booleans 
● Numbers like in Java
Data literals 
● [1 2 3] - Vector 
● {:key value :key1 value1} - Map 
● #{:key :key1} - Set 
● #() - Анонимная функция (fn)
Definitions 
Определяет “переменные”: 
(def x (+ 1 (- 3 1)))
Named functions 
(defn foo 
"This is documentation" 
[arguments] 
body) 
Параметры анонимных функций 
определяются также.
Higher order functions 
Можно в качестве параметров передавать и 
другие функции, например: 
(map inc [1 2 3]) 
Или анонимный вариант: 
(map (fn [i] (+ i 1)) [1 2 3])
Scoped definitions (let) 
Можно определить переменные, которые 
будут видны лишь внутри s-expr: 
(def sum-result 
(let [pi Math/PI] 
(/ (* pi pi) 6)))
Conrol structures
if 
Ранее уже видели, else branch должен 
обязательно присутствовать
do 
Если нужно выполнить несколько 
выражений прежде, чем что-то вернуть. 
Признак side effects: 
(do 
expr1 
expr2 
return-expression)
when 
Всегда возвращает nil. Комбинация if только 
с then branch и do. 
(when (even? 2) 
expr1 
expr2)
if-let 
Комбинация let и if с проверкой на nil/false: 
(def France {:capital "Paris"}) 
(if-let [capital (:capital France)] 
(println "Capital is " capital) 
(println "Capital is empty"))
cond 
Является альтернативой для else-if цепочек: 
(defn foo [n] 
(cond 
(> n 0) "positive" 
(< n 0) "negative" 
:else "zero"))
More Clojure basics
Function composition 
Следующий код легко может быть 
переписан: 
(fn [e] (fn1 (fn2 e))) 
Короче будет так: 
(comp fn1 fn2)
Function application 
Есть более длинная форма для вызова 
функции, ее можно использовать, например, 
в макросах: 
(apply + [1 2 3])
Namespaces 
Каждый символ определен в каком-то 
namespace, его можно задать с помощью 
вызова ns: 
(ns mylib.core)
:requre 
С помощью этого ключа можно добавить в 
namespace элементы из других namespaces: 
(ns foo 
(:require 
clojure.test 
[clojure.string :as str]))
:use 
Это сочетание :require и :refer. Использовать 
следует с осторожностью, как пример: 
(ns foo 
(:use clojure.string)) 
WARNING: replace already refers to: #'clojure.core/replace in namespace: foo, being replaced by: #'clojure.string/replace 
WARNING: reverse already refers to: #'clojure.core/reverse in namespace: foo, being replaced by: #'clojure.string/reverse
:only 
Для того, чтобы избежать подобных 
проблем, можно использовать ключ :only 
(ns foo (:use 
[clojure.string :only [join]]))
:import 
С помощью этого ключа можно добавлять 
классы из Java: 
(ns some.foo.space 
"This is namespace doc" 
(:import (java.util Date 
GregorianCalendar)))
Clojure data structures
Lists 
Списки определяются так: 
'(1 2 3) 
'("Scala" "Kotlin" "Erlang" 
"Clojure")
Vectors 
Вектора уже ранее определяли, это аналог 
массивов в Clojure.
Sets 
Множества задаются двумя способами 
#{1 2 3} 
(set [1 2 3])
Maps 
Также уже ранее обсуждали: 
{:id 55 
:name "Clojure" 
:is-dynamic true}
Immutability 
Все структуры данных в Clojure 
неизменяемы. 
Чаще всего, вновь создаваемые, структуры 
данных используют предыдущие версии, но 
все равно это может быть медленно.
Transient 
Для performance critical single-threaded 
кусков кода, можно написать все быстрее: 
(defn vrange [n] 
(loop [i 0 v (transient [])] 
(if (< i n) 
(recur (inc i) (conj! v i)) 
(persistent! v))))
Vectors and Maps basics
get 
Для векторов достает элемент по индексу. 
Для Maps достает элемент по ключу. 
(get [1 2 3] 1) ;2 
(get {:one 1} :one) ;1 
get-in принимает вектор, и выполняет 
последовательно get 
(get-in [1 [1 2] 3] [1 1]) ;2
assoc 
Для векторов добавляет новый элемент по 
индексу (возвращает новый вектор). 
Для Maps добавляет новую пару key/value 
(assoc [] 0 1) ;[1] 
(assoc {} :key :value) 
;{:key :value}
dissoc 
Удаляет элемент по ключу в Maps: 
(dissoc {:key :value} :key) ; {}
keys/vals 
Для Maps мы можем вытащить keys и values: 
(keys {:a :b :c :d}); (:a :c) 
(vals {:a :b :c :d}); (:b :d)
merge 
Также можно объединять несколько Maps, 
перекрывая значения слева направо 
(merge {:a :x :c :x} 
{:a :b} 
{:a :c :e :f}) 
; {:a :c :c :x :e :f}
merge-with 
Если мы хотим перекрывать справа налево, 
то это тоже возможно: 
(merge-with (fn [a b] a) 
{:a :x :c :x} 
{:a :b} 
{:a :c :e :f}) 
; {:a :x :c :x :e :f}
All collections basics
cons 
Образуется от слова construct, может 
добавлять первый элемент к спискам и 
векторам 
(cons 1 [1 2]) ; [1 1 2] 
(cons 1 '(1 2)) ; (1 1 2)
conj 
Добавляет элемент туда, где это удобнее в 
плане реализации коллекции: 
(conj [1 2] 1) ; [1 2 1] 
(conj '(1 2) 1) ; (1 1 2)
concat 
Объединяет две последовательности в один 
список 
(concat [1 2] '(3 4)) ; (1 2 3 4)
disj 
Удаляет элемент из множества (и только!) 
(disj #{:a :b} :a) ; #{:b}
seq 
Превращает любую коллекцию (включая 
Java collections, arrays) в seq коллекцию. 
Что важно, пустая коллекция превращается 
в nil.
Advanced collection operations
partition 
Разбивает коллекцию на части 
определенной длины. Можно указать шаг, 
тогда части смогут перекрываться: 
(partition 2 [1 2 3 4 5]) 
; ((1 2) (3 4))
flatten 
Собирает одну коллекцию из коллекции 
коллекций: 
(flatten [a [b] [c d]]) 
; (a b c d)
frequencies 
Возвращает частоту, встречающихся 
элементов: 
(frequencies [1 2 3 2 1 2]) 
; {1 2, 2 3, 3 1}
every? 
Проверяет, что все элементы удовлетворяют 
некоторому предикату: 
(every? even? [2 4 6]) ; true 
(every? even? [1 2 3]) ; false
some 
true если хотя бы один элемент 
удовлетворяет предикату: 
(some even? [2 4 5]) ; true 
(some even? [1 5 3]) ; nil
for comprehensions 
Создает ленивую коллекцию 
(for [x (range 2) 
y (range 2)] [x y]) 
; [0 0] [0 1] [1 0] [1 1] 
(for [x (range 3) 
:while (even? x)] x) 
; [2]
doseq 
Поэтому для side effects нужно использовать 
doseq, в котором они предполагаются, и 
функция всегда возвращает nil.
Functional collections
map 
Для преобразования всех элементов 
коллекции можно использовать обычную 
функцию map: 
(defn fun [i] (+ 1 i)) 
(map fun [1 2 3])
mapcat 
Аналогично flatMap в Scala, в Clojure есть 
mapcat. 
(defn fun[i] (repeat i i)) 
(mapcat fun [1 2 3]) 
Получится (1 2 2 3 3 3)
filter and remove 
Две по сути одинаковые функции, только 
отличаются условием предиката 
(filter even? (1 2 3 4)) 
;(2 4) 
(remove even? (1 2 3 4)) 
;(1 3)
reduce 
Это тоже самое, что и foldLeft. Есть вариант, 
где первый элемент становится начальным 
значением или что-то другое: 
(reduce + [1 2 3]) ;6 
(reduce cons '() [1 2 3]) 
; (3 2 1)
reductions 
Это reduce, который сохраняет все 
промежуточные значения 
(reductions + [1 2 3]) 
; (1 3 6)
Recursion
Simple recursion 
Просто можно вызвать функцию из тела: 
(defn sum 
[[head & tail]] 
(if (nil? head) 0 
(+ head (sum tail)))
mutual recursion 
Иногда нужно, чтобы две функции умели 
друг друга вызывать, на помощь приходит 
declare для второй функции. 
(declare fun-2) 
(defn fun-1 [i] 
(if (< i 3) i (fun-2 (- i 1)))) 
(defn fun-2 [i] 
(if (< i 2) i (fun-1 (- i 2))))
tail recursion 
Но если мы вызовем 
(sum (range 10000)) 
то получим StackOverflowError...
tail recursion 
Правильно использовать recur: 
(defn sum 
([[head & tail] acc] 
(if (nil? head) acc 
(recur tail (+ acc head)))) 
([coll] (sum coll 0)))
loop/recur 
Альтернативой может быть loop/recur: 
(defn sum [coll] 
(loop [[head & tail] coll 
acc 0] 
(if (nil? head) acc 
(recur tail (+ acc head)))))
Homework 
1. Напишите функцию call-twice, которая берет на вход функцию и 
параметр, и вызывает эту функцию два раза (не composition). 
2. Напишите функцию, которая читает из файла (используйте slurp), затем 
выводит текст консоль, и возвращает этот текст. 
3. Напишите def cube-anonymous, в который присвоена функция, которая 
возводит число в куб. 
4. Напишите функцию, которая на вход принимает два seq, и возвращает 
объединенные развернутые последовательности (concat + reverse) 
5. Напишите функцию, которая возвращает, есть ли элемент в seq 
(contains? не подходит, так как проверяет наличие индекса) 
6. Напишите функцию, которая по двум последовательностям выводит все 
различных элементов пары в консоль (сравнение это = или not=) 
7. Напишите функцию, которая возвращает seq повторений элемента elem 
n раз.

Mais conteúdo relacionado

Mais procurados

C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухинcorehard_by
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonPython Meetup
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksMikhail Kurnosov
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)Smolensk Computer Science Club
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Yandex
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6Dmitry Soshnikov
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython Meetup
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Platonov Sergey
 
Ecma script 6 yevhen diachenko
Ecma script 6 yevhen diachenkoEcma script 6 yevhen diachenko
Ecma script 6 yevhen diachenkoDenis Khabrenko
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Alexander Granin
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Sergey Platonov
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...Alexey Paznikov
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3Eugeniy Tyumentcev
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x IntroductionFedor Vompe
 
Something about Golang
Something about GolangSomething about Golang
Something about GolangAnton Arhipov
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
 
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...Alexey Paznikov
 

Mais procurados (20)

C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки Python
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building Blocks
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)
 
Charming python sc2-8
Charming python sc2-8Charming python sc2-8
Charming python sc2-8
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.by
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
 
Ecma script 6 yevhen diachenko
Ecma script 6 yevhen diachenkoEcma script 6 yevhen diachenko
Ecma script 6 yevhen diachenko
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
 
Something about Golang
Something about GolangSomething about Golang
Something about Golang
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
 
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
 

Destaque

FlatGUI: Reactive GUI Toolkit Implemented in Clojure
FlatGUI: Reactive GUI Toolkit Implemented in ClojureFlatGUI: Reactive GUI Toolkit Implemented in Clojure
FlatGUI: Reactive GUI Toolkit Implemented in Clojuredenyslebediev
 
Транзакционная память (on Russian)
Транзакционная память (on Russian)Транзакционная память (on Russian)
Транзакционная память (on Russian)JIghtuse
 
Валкин, Мокевнин — Развитие IT-среды в Ульяновске
Валкин, Мокевнин — Развитие IT-среды в УльяновскеВалкин, Мокевнин — Развитие IT-среды в Ульяновске
Валкин, Мокевнин — Развитие IT-среды в УльяновскеDaria Oreshkina
 
Александр Жарков — Эволюция команды разработки: взгляд изнутри
Александр Жарков — Эволюция команды разработки: взгляд изнутриАлександр Жарков — Эволюция команды разработки: взгляд изнутри
Александр Жарков — Эволюция команды разработки: взгляд изнутриDaria Oreshkina
 
JSLab. Максим Климишин. "Трансдюсеры, CSP каналы, неизменяемые структуры данных"
JSLab. Максим Климишин. "Трансдюсеры, CSP каналы, неизменяемые структуры данных"JSLab. Максим Климишин. "Трансдюсеры, CSP каналы, неизменяемые структуры данных"
JSLab. Максим Климишин. "Трансдюсеры, CSP каналы, неизменяемые структуры данных"GeeksLab Odessa
 
PiterPy 2015 - Трансдюсеры и Python
PiterPy 2015 - Трансдюсеры и PythonPiterPy 2015 - Трансдюсеры и Python
PiterPy 2015 - Трансдюсеры и PythonMax Klymyshyn
 
Under the hood of scala implicits (Scala eXchange 2014)
Under the hood of scala implicits (Scala eXchange 2014)Under the hood of scala implicits (Scala eXchange 2014)
Under the hood of scala implicits (Scala eXchange 2014)Alexander Podkhalyuzin
 
Under the hood of scala implicits (kl10tch 10.03.2015)
Under the hood of scala implicits (kl10tch 10.03.2015)Under the hood of scala implicits (kl10tch 10.03.2015)
Under the hood of scala implicits (kl10tch 10.03.2015)Alexander Podkhalyuzin
 
Backend: Пишем на Scala для браузера
Backend: Пишем на Scala для браузераBackend: Пишем на Scala для браузера
Backend: Пишем на Scala для браузераCodeFest
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013ScalaNsk
 

Destaque (20)

FlatGUI: Reactive GUI Toolkit Implemented in Clojure
FlatGUI: Reactive GUI Toolkit Implemented in ClojureFlatGUI: Reactive GUI Toolkit Implemented in Clojure
FlatGUI: Reactive GUI Toolkit Implemented in Clojure
 
Транзакционная память (on Russian)
Транзакционная память (on Russian)Транзакционная память (on Russian)
Транзакционная память (on Russian)
 
Валкин, Мокевнин — Развитие IT-среды в Ульяновске
Валкин, Мокевнин — Развитие IT-среды в УльяновскеВалкин, Мокевнин — Развитие IT-среды в Ульяновске
Валкин, Мокевнин — Развитие IT-среды в Ульяновске
 
Александр Жарков — Эволюция команды разработки: взгляд изнутри
Александр Жарков — Эволюция команды разработки: взгляд изнутриАлександр Жарков — Эволюция команды разработки: взгляд изнутри
Александр Жарков — Эволюция команды разработки: взгляд изнутри
 
JSLab. Максим Климишин. "Трансдюсеры, CSP каналы, неизменяемые структуры данных"
JSLab. Максим Климишин. "Трансдюсеры, CSP каналы, неизменяемые структуры данных"JSLab. Максим Климишин. "Трансдюсеры, CSP каналы, неизменяемые структуры данных"
JSLab. Максим Климишин. "Трансдюсеры, CSP каналы, неизменяемые структуры данных"
 
PiterPy 2015 - Трансдюсеры и Python
PiterPy 2015 - Трансдюсеры и PythonPiterPy 2015 - Трансдюсеры и Python
PiterPy 2015 - Трансдюсеры и Python
 
Feature suggester
Feature suggesterFeature suggester
Feature suggester
 
Scala magic
Scala magicScala magic
Scala magic
 
Scala lecture #4
Scala lecture #4Scala lecture #4
Scala lecture #4
 
Under the hood of scala implicits (Scala eXchange 2014)
Under the hood of scala implicits (Scala eXchange 2014)Under the hood of scala implicits (Scala eXchange 2014)
Under the hood of scala implicits (Scala eXchange 2014)
 
Erlang
ErlangErlang
Erlang
 
Under the hood of scala implicits (kl10tch 10.03.2015)
Under the hood of scala implicits (kl10tch 10.03.2015)Under the hood of scala implicits (kl10tch 10.03.2015)
Under the hood of scala implicits (kl10tch 10.03.2015)
 
Backend: Пишем на Scala для браузера
Backend: Пишем на Scala для браузераBackend: Пишем на Scala для браузера
Backend: Пишем на Scala для браузера
 
Lec 2
Lec 2Lec 2
Lec 2
 
Scala #3
Scala #3Scala #3
Scala #3
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
 
Scala plugin for IntelliJ IDEA
Scala plugin for IntelliJ IDEAScala plugin for IntelliJ IDEA
Scala plugin for IntelliJ IDEA
 
Scala #2
Scala #2Scala #2
Scala #2
 
Scala training
Scala trainingScala training
Scala training
 
Scala #4
Scala #4Scala #4
Scala #4
 

Semelhante a Clojure #1

Clojure – есть ли жизнь после Java
Clojure – есть ли жизнь после JavaClojure – есть ли жизнь после Java
Clojure – есть ли жизнь после JavaOlim Saidov
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)Alex Filatov
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey TeplyakovAlex Tumanoff
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Alex Ott
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программированияAlex.Kolonitsky
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовMikhail Kurnosov
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияYandex
 
Лекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk PlusЛекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk PlusMikhail Kurnosov
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовMikhail Kurnosov
 
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в TarantoolИнструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в TarantoolTimur Safin
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовТранслируем.бел
 
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)ScalaNsk
 

Semelhante a Clojure #1 (20)

Clojure – есть ли жизнь после Java
Clojure – есть ли жизнь после JavaClojure – есть ли жизнь после Java
Clojure – есть ли жизнь после Java
 
Урок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графовУрок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графов
 
Урок 7. Интерпретация и компиляция функциональных программ.
Урок 7. Интерпретация и компиляция функциональных программ.Урок 7. Интерпретация и компиляция функциональных программ.
Урок 7. Интерпретация и компиляция функциональных программ.
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
 
Основы Python. Функции
Основы Python. ФункцииОсновы Python. Функции
Основы Python. Функции
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программирования
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмов
 
JavaScript Intro
JavaScript IntroJavaScript Intro
JavaScript Intro
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
 
Лекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk PlusЛекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk Plus
 
Асинхронный JavaScript
Асинхронный JavaScriptАсинхронный JavaScript
Асинхронный JavaScript
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
 
2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure
 
Урок 4. "Завязывание узлов". Классы
Урок 4. "Завязывание узлов". КлассыУрок 4. "Завязывание узлов". Классы
Урок 4. "Завязывание узлов". Классы
 
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в TarantoolИнструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетов
 
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
 
Scala for android
Scala for androidScala for android
Scala for android
 

Clojure #1

  • 2. Why Clojure? ● For JVM with Java interoperability ● Instant run/reloading ● Functional ● Lisp features (macros, expressive) ● built-in STM ● Dynamic ● Good performance
  • 3. Important tools ● Leiningen - Clojure build tool ● REPL, nREPL ● Editors: IDEA (La Clojure, Cursive), Emacs, Light Table
  • 5. Functions Очень простой синтаксис: (fn [] 4)
  • 6. Function call Любая функция вызывается в prefix нотации: (+ 1 1) В данном случае + это функция, а единицы это аргументы.
  • 7. Expressions В Clojure, как практически и в Scala все является выражением, то есть возвращает значение: (if condition then-branch else-branch)
  • 8. Literals ● "a string" - String ● :key - Keyword ● 'symbol - Symbol ● newline, c - Character ● nil - No value ● true, false - Booleans ● Numbers like in Java
  • 9. Data literals ● [1 2 3] - Vector ● {:key value :key1 value1} - Map ● #{:key :key1} - Set ● #() - Анонимная функция (fn)
  • 11. Named functions (defn foo "This is documentation" [arguments] body) Параметры анонимных функций определяются также.
  • 12. Higher order functions Можно в качестве параметров передавать и другие функции, например: (map inc [1 2 3]) Или анонимный вариант: (map (fn [i] (+ i 1)) [1 2 3])
  • 13. Scoped definitions (let) Можно определить переменные, которые будут видны лишь внутри s-expr: (def sum-result (let [pi Math/PI] (/ (* pi pi) 6)))
  • 15. if Ранее уже видели, else branch должен обязательно присутствовать
  • 16. do Если нужно выполнить несколько выражений прежде, чем что-то вернуть. Признак side effects: (do expr1 expr2 return-expression)
  • 17. when Всегда возвращает nil. Комбинация if только с then branch и do. (when (even? 2) expr1 expr2)
  • 18. if-let Комбинация let и if с проверкой на nil/false: (def France {:capital "Paris"}) (if-let [capital (:capital France)] (println "Capital is " capital) (println "Capital is empty"))
  • 19. cond Является альтернативой для else-if цепочек: (defn foo [n] (cond (> n 0) "positive" (< n 0) "negative" :else "zero"))
  • 21. Function composition Следующий код легко может быть переписан: (fn [e] (fn1 (fn2 e))) Короче будет так: (comp fn1 fn2)
  • 22. Function application Есть более длинная форма для вызова функции, ее можно использовать, например, в макросах: (apply + [1 2 3])
  • 23. Namespaces Каждый символ определен в каком-то namespace, его можно задать с помощью вызова ns: (ns mylib.core)
  • 24. :requre С помощью этого ключа можно добавить в namespace элементы из других namespaces: (ns foo (:require clojure.test [clojure.string :as str]))
  • 25. :use Это сочетание :require и :refer. Использовать следует с осторожностью, как пример: (ns foo (:use clojure.string)) WARNING: replace already refers to: #'clojure.core/replace in namespace: foo, being replaced by: #'clojure.string/replace WARNING: reverse already refers to: #'clojure.core/reverse in namespace: foo, being replaced by: #'clojure.string/reverse
  • 26. :only Для того, чтобы избежать подобных проблем, можно использовать ключ :only (ns foo (:use [clojure.string :only [join]]))
  • 27. :import С помощью этого ключа можно добавлять классы из Java: (ns some.foo.space "This is namespace doc" (:import (java.util Date GregorianCalendar)))
  • 29. Lists Списки определяются так: '(1 2 3) '("Scala" "Kotlin" "Erlang" "Clojure")
  • 30. Vectors Вектора уже ранее определяли, это аналог массивов в Clojure.
  • 31. Sets Множества задаются двумя способами #{1 2 3} (set [1 2 3])
  • 32. Maps Также уже ранее обсуждали: {:id 55 :name "Clojure" :is-dynamic true}
  • 33. Immutability Все структуры данных в Clojure неизменяемы. Чаще всего, вновь создаваемые, структуры данных используют предыдущие версии, но все равно это может быть медленно.
  • 34. Transient Для performance critical single-threaded кусков кода, можно написать все быстрее: (defn vrange [n] (loop [i 0 v (transient [])] (if (< i n) (recur (inc i) (conj! v i)) (persistent! v))))
  • 36. get Для векторов достает элемент по индексу. Для Maps достает элемент по ключу. (get [1 2 3] 1) ;2 (get {:one 1} :one) ;1 get-in принимает вектор, и выполняет последовательно get (get-in [1 [1 2] 3] [1 1]) ;2
  • 37. assoc Для векторов добавляет новый элемент по индексу (возвращает новый вектор). Для Maps добавляет новую пару key/value (assoc [] 0 1) ;[1] (assoc {} :key :value) ;{:key :value}
  • 38. dissoc Удаляет элемент по ключу в Maps: (dissoc {:key :value} :key) ; {}
  • 39. keys/vals Для Maps мы можем вытащить keys и values: (keys {:a :b :c :d}); (:a :c) (vals {:a :b :c :d}); (:b :d)
  • 40. merge Также можно объединять несколько Maps, перекрывая значения слева направо (merge {:a :x :c :x} {:a :b} {:a :c :e :f}) ; {:a :c :c :x :e :f}
  • 41. merge-with Если мы хотим перекрывать справа налево, то это тоже возможно: (merge-with (fn [a b] a) {:a :x :c :x} {:a :b} {:a :c :e :f}) ; {:a :x :c :x :e :f}
  • 43. cons Образуется от слова construct, может добавлять первый элемент к спискам и векторам (cons 1 [1 2]) ; [1 1 2] (cons 1 '(1 2)) ; (1 1 2)
  • 44. conj Добавляет элемент туда, где это удобнее в плане реализации коллекции: (conj [1 2] 1) ; [1 2 1] (conj '(1 2) 1) ; (1 1 2)
  • 45. concat Объединяет две последовательности в один список (concat [1 2] '(3 4)) ; (1 2 3 4)
  • 46. disj Удаляет элемент из множества (и только!) (disj #{:a :b} :a) ; #{:b}
  • 47. seq Превращает любую коллекцию (включая Java collections, arrays) в seq коллекцию. Что важно, пустая коллекция превращается в nil.
  • 49. partition Разбивает коллекцию на части определенной длины. Можно указать шаг, тогда части смогут перекрываться: (partition 2 [1 2 3 4 5]) ; ((1 2) (3 4))
  • 50. flatten Собирает одну коллекцию из коллекции коллекций: (flatten [a [b] [c d]]) ; (a b c d)
  • 51. frequencies Возвращает частоту, встречающихся элементов: (frequencies [1 2 3 2 1 2]) ; {1 2, 2 3, 3 1}
  • 52. every? Проверяет, что все элементы удовлетворяют некоторому предикату: (every? even? [2 4 6]) ; true (every? even? [1 2 3]) ; false
  • 53. some true если хотя бы один элемент удовлетворяет предикату: (some even? [2 4 5]) ; true (some even? [1 5 3]) ; nil
  • 54. for comprehensions Создает ленивую коллекцию (for [x (range 2) y (range 2)] [x y]) ; [0 0] [0 1] [1 0] [1 1] (for [x (range 3) :while (even? x)] x) ; [2]
  • 55. doseq Поэтому для side effects нужно использовать doseq, в котором они предполагаются, и функция всегда возвращает nil.
  • 57. map Для преобразования всех элементов коллекции можно использовать обычную функцию map: (defn fun [i] (+ 1 i)) (map fun [1 2 3])
  • 58. mapcat Аналогично flatMap в Scala, в Clojure есть mapcat. (defn fun[i] (repeat i i)) (mapcat fun [1 2 3]) Получится (1 2 2 3 3 3)
  • 59. filter and remove Две по сути одинаковые функции, только отличаются условием предиката (filter even? (1 2 3 4)) ;(2 4) (remove even? (1 2 3 4)) ;(1 3)
  • 60. reduce Это тоже самое, что и foldLeft. Есть вариант, где первый элемент становится начальным значением или что-то другое: (reduce + [1 2 3]) ;6 (reduce cons '() [1 2 3]) ; (3 2 1)
  • 61. reductions Это reduce, который сохраняет все промежуточные значения (reductions + [1 2 3]) ; (1 3 6)
  • 63. Simple recursion Просто можно вызвать функцию из тела: (defn sum [[head & tail]] (if (nil? head) 0 (+ head (sum tail)))
  • 64. mutual recursion Иногда нужно, чтобы две функции умели друг друга вызывать, на помощь приходит declare для второй функции. (declare fun-2) (defn fun-1 [i] (if (< i 3) i (fun-2 (- i 1)))) (defn fun-2 [i] (if (< i 2) i (fun-1 (- i 2))))
  • 65. tail recursion Но если мы вызовем (sum (range 10000)) то получим StackOverflowError...
  • 66. tail recursion Правильно использовать recur: (defn sum ([[head & tail] acc] (if (nil? head) acc (recur tail (+ acc head)))) ([coll] (sum coll 0)))
  • 67. loop/recur Альтернативой может быть loop/recur: (defn sum [coll] (loop [[head & tail] coll acc 0] (if (nil? head) acc (recur tail (+ acc head)))))
  • 68. Homework 1. Напишите функцию call-twice, которая берет на вход функцию и параметр, и вызывает эту функцию два раза (не composition). 2. Напишите функцию, которая читает из файла (используйте slurp), затем выводит текст консоль, и возвращает этот текст. 3. Напишите def cube-anonymous, в который присвоена функция, которая возводит число в куб. 4. Напишите функцию, которая на вход принимает два seq, и возвращает объединенные развернутые последовательности (concat + reverse) 5. Напишите функцию, которая возвращает, есть ли элемент в seq (contains? не подходит, так как проверяет наличие индекса) 6. Напишите функцию, которая по двум последовательностям выводит все различных элементов пары в консоль (сравнение это = или not=) 7. Напишите функцию, которая возвращает seq повторений элемента elem n раз.