Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Clojure на производстве. Зиперы, базы данных и REPL

Покупка
Новинка
Артикул: 856002.01.99
Доступ онлайн
1 399 ₽
В корзину
Продолжение книги «Clojure на производстве» об одноименном языке. В этот раз мы рассмотрим зипперы, работу с базой данных и обширное понятие REPL. Материал нацелен на практику и отталкивается от реальных задач, которые ждут в повседневной работе. Как и первый том, книга не содержит азов изучения Clojure. Ожидается, что читатель знаком с Clojure или другим промышленным языком.
Гришаев, И. В. Clojure на производстве. Зиперы, базы данных и REPL : практическое руководство / И. В. Гришаев. – Москва : ДМК Пресс, 2023. - 366 с. – ISBN 978-5-93700-232-7. - Текст : электронный. - URL: https://znanium.ru/catalog/product/2204254 (дата обращения: 04.04.2025). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов
Иван Гришаев
Clojure на производстве
Зипперы, базы данных, REPL
Редакция 7c13cd7
Москва, 2023


УДК	 004.04
ББК	 32.372
Г82
Гришаев И. В.
Г82 	 Clojure на производстве. Зиперы, базы данных и REPL. – М.: ДМК Пресс, 
2023. – 364 с.: ил. 
ISBN 978-5-93700-232-7
Продолжение книги «Clojure на производстве» об одноименном языке. В этот 
раз мы рассмотрим зипперы, работу с базой данных и обширное понятие REPL. 
Материал нацелен на практику и отталкивается от реальных задач, которые ждут 
в повседневной работе.
Как и первый том, книга не содержит азов изучения Clojure. Ожидается, что 
читатель знаком с Clojure или другим промышленным языком.
УДК  004.04
ББК  32.372
Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения 
владельцев авторских прав.
	
©  Гришаев И. В., 2023
ISBN 978-5-93700-232-7	
©  Издание, ДМК Пресс, 2023


Оглавление
1
Зипперы
9
1.1
Азы навигации . . . . . . . . . . . . . . . . . . . . . .
9
1.2
Автонавигация . . . . . . . . . . . . . . . . . . . . . .
19
1.3
XML-зипперы
. . . . . . . . . . . . . . . . . . . . . .
26
1.4
Поиск в XML . . . . . . . . . . . . . . . . . . . . . . .
32
1.5
Редактирование . . . . . . . . . . . . . . . . . . . . .
40
1.6
Виртуальные деревья. Обмен валют
. . . . . . . . .
54
1.7
Обход в ширину. Улучшенный обмен валют . . . . .
65
1.8
Заключение . . . . . . . . . . . . . . . . . . . . . . . .
74
2
Реляционные базы данных
81
2.1
Запросы . . . . . . . . . . . . . . . . . . . . . . . . . .
83
2.2
Доступ из Clojure . . . . . . . . . . . . . . . . . . . .
84
2.3
Знакомство с clojure.java.jdbc
. . . . . . . . . . . . .
85
2.4
Основы clojure.java.jdbc . . . . . . . . . . . . . . . . .
88
2.5
Подробнее о запросах . . . . . . . . . . . . . . . . . .
95
2.6
Результат запроса . . . . . . . . . . . . . . . . . . . . 103
2.7
Транзакции . . . . . . . . . . . . . . . . . . . . . . . .
111
2.8
JDBC-спека с состоянием . . . . . . . . . . . . . . . . 116
2.9
SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . .
121
2.10 Сложные типы . . . . . . . . . . . . . . . . . . . . . . 126
2.11 Проблемы SQL . . . . . . . . . . . . . . . . . . . . . . 142
2.12 Структура и группировка
. . . . . . . . . . . . . . . 165
2.13 Группировка в базе . . . . . . . . . . . . . . . . . . . 184
2.14 Миграции . . . . . . . . . . . . . . . . . . . . . . . . . 194
2.15 Next.JDBC . . . . . . . . . . . . . . . . . . . . . . . . 206
2.16 Заключение . . . . . . . . . . . . . . . . . . . . . . . .
211


REPL, Cider, Emacs
215
3.1
Исторический экскурс
. . . . . . . . . . . . . . . . . 216
3.2
Пробуем REPL . . . . . . . . . . . . . . . . . . . . . . 217
3.3
Более сложный сценарий . . . . . . . . . . . . . . . . 223
3.4
Свой REPL . . . . . . . . . . . . . . . . . . . . . . . . 228
3.5
Полезные функции REPL
. . . . . . . . . . . . . . . 248
3.6
REPL в редакторе . . . . . . . . . . . . . . . . . . . . 250
3.7
Знакомство с nREPL
. . . . . . . . . . . . . . . . . . 254
3.8
Подключение из Clojure
. . . . . . . . . . . . . . . .
261
3.9
Клиенты nREPL для редакторов . . . . . . . . . . . 268
3.10 Emacs и Cider
. . . . . . . . . . . . . . . . . . . . . . 269
3.11 Тесты в Cider . . . . . . . . . . . . . . . . . . . . . . . 289
3.12 Отладка сообщений nREPL
. . . . . . . . . . . . . . 293
3.13 Отладка . . . . . . . . . . . . . . . . . . . . . . . . . . 293
3.14 Отладка в Cider . . . . . . . . . . . . . . . . . . . . . 314
3.15 nREPL в Docker . . . . . . . . . . . . . . . . . . . . . 324
3.16 nREPL в боевом режиме . . . . . . . . . . . . . . . . 330
3.17 REPL в других средах
. . . . . . . . . . . . . . . . . 342
3.18 Заключение . . . . . . . . . . . . . . . . . . . . . . . . 353
Послесловие
355
Предметный указатель
356



Об этой книге
Перед вами второй том «Clojure на производстве». Это продолжение первой книги, которая вышла три года назад. Мы продолжим изучать Clojure — замечательный язык с акцентом на
неизменяемость и асинхронность. Clojure называют современным
Лиспом, потому что код на нем пишут S-выражениями — то есть
со скобками.
По структуре и изложению книга не отличается от первой. Мы
подробно рассмотрим несколько тем, чередуя теорию с практикой.
Каждая мысль в тексте подтверждается кодом, и наоборот: сложный код разбит на части и подробно описан текстом.
Как и первый том, продолжение написано на русском языке.
Автор много лет пишет на Clojure и знаком с индустрией и сообществом. Все примеры и задачи автор взял из реальных проектов;
каждую строчку кода выполнил в REPL.
Коротко о том, что вас ждет. Первая глава расскажет о зипперах в Clojure. Это особый способ работы с коллекциями: непривычный, но крайне мощный. О зипперах мало информации даже
на английском языке, и книга закрывает этот недостаток.
Вторая глава посвящена реляционным базам данных, в основном PostgreSQL. Мы рассмотрим основы SQL, подключение и работу с базой из Clojure. Автор учел все наболевшие темы: построение
сложных запросов, шаблонизацию SQL, работу с выборкой и все
то, о чем забывают другие руководства.
Третья глава охватывает сразу три смежные темы — REPL,
Cider и Emacs. Читатель узнает, что такое REPL и как подключиться к нему из редактора. Мы поговорим о сетевом протоколе nREPL,
о запуске проекта в Docker и на удаленной машине. Рассмотрим
REPL на платформе Javascript и проведем массу экспериментов.
В тексте мы не раз ссылаемся на первую книгу, особенно когда
речь идет об исключениях, системах или Clojure.spec. Это не
помешает разобраться с темой, даже если вы не читали первый
том. Все же автор советует ознакомиться с ним для лучшего
понимания.
Книга рассчитана на продвинутую аудиторию. Желательно,
чтобы у вас был опыт если не с Clojure, то хотя бы с одним
из промышленных языков. Пожелаем читателю терпения, чтобы
прочесть книгу до конца.
6


Код
Исходный код книги в виде файлов LATEX находится в репозитории
igrishaev/clj-book21. Если вы нашли опечатку, создайте pull
clj-book2
request или issue с описанием проблемы.
Код первой главы о зипперах доступен в репозитории igrishaev/zipper-manual2. Код второй и третьей — в репозитоZipper
manual
рии igrishaev/book-sessions3, пути src/book/db.clj и replBook
sessions
chapter соответственно.
Используйте код в любых целях, в том числе коммерческих.
Благодарности
Автор благодарен стартапу Clashapp4 (ныне Huddles) и его коллекClashapp
тиву за полученный опыт. Некоторые техники из этого проекта
нашли место в книге.
Спасибо читателям блога за присланные опечатки и уточнения.
С ними текст удалось улучшить до сдачи в печать.
Особая благодарность Андрею Листопадову за детальные отзывы к черновикам глав. Посетите его сайт: andreyor.st5.
Andrey
Orst
Благодарю коллектив издательства «ДМК Пресс» за то, что
взяли рукопись в работу. Их усилиями вы читаете эту книгу
сейчас.
Обратная связь
Присылайте ошибки и замечания на почту ivan@grishaev.me.
Автор обновит макет, и, возможно, следующий читатель получит
исправленную версию книги.
1 github.com/igrishaev/clj-book2 .
2 github.com/igrishaev/zipper-manual .
3 github.com/igrishaev/book-sessions .
4 huddlesapp.co .
5 andreyor.st .
7



Глава 1
Зипперы
В этой главе мы рассмотрим зипперы в языке Clojure. Это необычный способ работы с коллекциями. С помощью зиппера можно
обойти произвольные данные, изменить их или выполнить поиск.
Зиппер — мощный инструмент, но вложения в него окупаются со
временем. Это сложная абстракция, которая требует подготовки.
1.1
Азы навигации
Объясним зиппер простыми словами. Это обёртка над данными с
набором действий. Вот некоторые из них:
• перемещение по вертикали: вниз к потомкам или вверх к
родителю;
• перемещение по горизонтали: влево или вправо среди потомков;
• обход всех элементов;
• добавление, редактирование и удаление узлов.
Это неполный список того, что умеют зипперы. Другие их
свойства мы рассмотрим по ходу главы. Важно, что указанные
действия относятся к любым данным, будь то комбинация векторов и словарей, дерево узлов или XML. Из-за этого зипперы
становятся мощным инструментом. Разобраться с ними означает
повысить свои навыки и открыть новые двери.
9


Термин «зиппер» ввел ученый Жерар Юэ1 (G´erard Huet)
G´erard
Huet
в 1996 году. Юэ занимался деревьями и искал универсальный
способ работы с ними. В знаменитой работе «Functional Pearl:
The Zipper»2 Юэ привел концепцию зиппера на языке OCaml.
zipper.pdf
Документ привлек внимание простотой и ясностью: описание
зиппера, включая код и комментарии, уместилось на четырёх
страницах. Современные зипперы почти не отличаются от того
изложения 1996 года.
Хотя Юэ отмечает, что зиппер можно создать на любом языке,
лучше всего они прижились в функциональных: Haskell, OCaml,
Clojure. Зипперы поощряют неизменяемые данные и чистые преобразования. Для указанных языков написаны библиотеки зипперов,
в некоторых случаях больше одной. Наоборот, в императивной
среде зипперы почти неизвестны.
Зипперы доступны в Clojure с первой версии. Их легко добавить в проект, не опасаясь проблем лицензии или новых зависимостей.
Зипперы в Clojure используют мощь неизменяемых коллекций.
Технически зиппер — это коллекция, которая хранит данные и
позицию в них. Всё вместе это называется локацией (location).
Шаг в любую сторону вернёт новую локацию подобно тому, как
функции assoc или update производят новые данные, оставляя
прежние нетронутыми.
Из текущей локации можно получить узел (ноду) — данные, на
которые ссылается указатель. На этом месте путаются новички,
поэтому уточним различие. Локация — это исходные данные и
положение в них. Передвижение по локации порождает локацию.
Из локации можно извлечь узел — данные, которые встретились
в локации.
Приведём пример с вектором [1 2 3]. Чтобы переместиться на
двойку, обернём данные в зиппер и выполним команды zip/down
и zip/right. С первым шагом мы провалимся в вектор и окажемся
на единице. Шаг вправо сдвинет нас на двойку.
Выразим это в коде: подключим модуль clojure.zip и переместимся по вектору:
1 en.wikipedia.org/wiki/Gerard_Huet .
2 www.st.cs.uni-saarland.de/edu/seminare/2005/advanced-fp/docs/huetzipper.pdf .
10


Похожие

Доступ онлайн
1 399 ₽
В корзину