Чаз Эмерик, Брайен Карпер, Кристоф Гранд
Программирование на Clojure
Chas Emerick, Brian Carper, Cristophe Grand
Clojure Programming
Practical Lisp for the Java World
Чаз Эмерик, Брайен Карпер, Кристоф Гранд
Программирование
на Clojure
Практика применения Lisp в мире Java
Москва, 2015
УДК 004. 432. 42Clojure
ББК 32. 973-018. 1
Э54
Эмерик Ч. , Карпер Б. , Гранд К. Э54 Программирование на Clojure: Пер. с англ. Киселева А. Н. –
М. : ДМК Пресс, 2015. – 816 с. : ил. ISBN 978-5-97060-299-7
Почему многие выбирают Clojure? Потому что это функциональный
язык программирования, не только позволяющий использовать Java-биб-
лиотеки, службы и другие ресурсы JVM, но и соперничающий с другими
динамическими языками, такими как Ruby и Python. Эта книга продемонстрирует вам гибкость Clojure в решении типичных
задач, таких как разработка веб-приложений и взаимодействие с базами
данных. Вы быстро поймете, что этот язык помогает устранить ненужные
сложности в своей практике и открывает новые пути решения сложных
проблем, включая многопоточное программирование. Издание предназначено для программистов, желающих освоить всю
мощь и гибкость функционального программирования. УДК 004. 432. 42Clojure
ББК 32. 973-018. 1
Все права защищены. Любая часть этой книги не может быть воспроиз-
ведена в какой бы то ни было форме и какими бы то ни было средствами без
письменного разрешения владельцев авторских прав. Материал, изложенный в данной книге, многократно проверен. Но, по-
скольку вероятность технических ошибок все равно существует, издательство
не может гарантировать абсолютную точность и правильность приводимых
сведений. В связи с этим издательство не несет ответственности за возможные
ошибки, связанные с использованием книги. ISBN 978-1-449-39470-7 (анг. ) Copyright © Chas Emerick,
Brian Carper, and Christophe Grand
ISBN 978-5-97060-299-7 (рус. ) © Оформление, перевод
ДМК Пресс, 2015
Содержание
Предисловие к русскому изданию ... ... ... ... ... ... ... ... ... ... ... ... ... ... . 15
Благодарности ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 16
Предисловие ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 17
Глава 1. Вниз по кроличьей норе ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... . 26
Почему Clojure? ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... . 26
Как получить Clojure ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 29
Интерактивная оболочка REPL для Clojure ... ... ... ... ... ... ... ... ... ... ... ... ... ... 30
Вам не придется путаться в частоколе скобок ... ... ... ... ... ... ... ... ... ... ... ... 34
Выражения, операторы, синтаксис и очередность ... ... ... ... ... ... ... ... ... . . 35
Гомоиконность ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... . . 38
Механизм чтения... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... . . 41
Скалярные литералы ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 43
Строки ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... . 43
Логические значения ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 43
nil ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 43
Знаки (characters) ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... . . 44
Ключевые слова (keywords) ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 44
Символы (symbols) ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... . 46
Числа ... ... ... ... ... ... ... ... ...
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 46
Регулярные выражения ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 48
Комментарии ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... . . 49
Пробелы и запятые ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... . . 51
Литералы коллекций ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 51
Прочий синтаксический сахар механизма чтения ... ... ... ... ... ... ... ... . . 52
Пространства имен ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... . 53
Интерпретация символов ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... . 56
Специальные формы ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... . . 57
Подавление вычислений: quote ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... . . 59
Блоки кода: do ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... . 60
Определение переменных: def ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 61
6 Содержание
Связывание локальных значений: let ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 62
Деструктуризация (let, часть 2)... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 64
Деструктуризация упорядоченных коллекций ... ... ... ... ... ... ... ... . . 65
Деструктуризация ассоциативных массивов ... ... ... ... ... ... ... ... ... . 69
Создание функций: fn ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... . . 74
Деструктуризация аргументов функций ... ... ... ... ... ... ... ... ... ... ... . . 77
Литералы функций ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... . 80
Выполнение по условию: if ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 82
Организация циклов: loop и recur ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... . . 83
Ссылки на переменные: var ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... . . 85
Взаимодействие с Java: .