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

Программирование на Clojure. Практика применения Lisp в мире Java

Покупка
Артикул: 817107.01.99
Доступ онлайн
719 ₽
В корзину
Почему многие выбирают Clojure? Потому что это функциональный язык программирования, не только позволяющий использовать Java-библиотеки, службы и другие ресурсы JVM, но и соперничающий с другими динамическими языками, такими как Ruby и Python. Эта книга продемонстрирует вам гибкость Clojure в решении типичных задач, таких как разработка веб-приложений и взаимодействие с базами данных. Вы быстро поймете, что этот язык помогает устранить ненужные сложности в своей практике и открывает новые пути решения сложных проблем, включая многопоточное программирование. Издание предназначено для программистов, желающих освоить всю мощь и гибкость функционального программирования.
Эмерик, Ч. Программирование на Clojure. Практика применения Lisp в мире Java : практическое руководство / Ч. Эмери, Б. Карпер, К. Гранд ; пер. с англ. А. Н. Киселёва. - 2-е изд. - Москва : ДМК Пресс, 2023. - 817 с. - ISBN 978-5-89818-600-5. - Текст : электронный. - URL: https://znanium.com/catalog/product/2108479 (дата обращения: 06.05.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Программирование на Clojure

Чаз Эмерик, Брайен Карпер, Кристоф Гранд
Practical Lisp for the Java World

Clojure Programming

Chas Emerick, Brian Carper, Cristophe Grand
Программирование 
на Clojure

Москва, 2023

Чаз Эмерик, Брайен Карпер, Кристоф Гранд

Практика применения Lisp в мире Java

2-е издание, электронное
УДК 004.432.42Clojure
ББК 32.973-018.1
Э54

Э54
Эмерик, Чаз.
Программирование на Clojure. Практика применения Lisp в мире Java / 
Ч. Эмерик, Б. Карпер, К. Гранд ; пер. с англ. А. Н. Киселёва. — 2-е изд., эл. — 
1 файл pdf : 817 с. — Москва : ДМК Пресс, 2023. — Систем. требования: 
Adobe Reader XI либо Adobe Digital Editions 4.5 ; экран 10". — Текст : электронный.

ISBN 978-5-89818-600-5

Почему многие выбирают Clojure? Потому что это функциональный язык программирования, 
не только позволяющий использовать Java-библиотеки, службы и 
другие ресурсы JVM, но и соперничающий с другими динамическими языками, такими 
как Ruby и Python.
Эта книга продемонстрирует вам гибкость Clojure в решении типичных задач, 
таких как разработка веб-приложений и взаимодействие с базами данных. Вы быстро 
поймете, что этот язык помогает устранить ненужные сложности в своей практике 
и открывает новые пути решения сложных проблем, включая многопоточное программирование.

Издание предназначено для программистов, желающих освоить всю мощь и гибкость 
функционального программирования.

УДК 004.432.42Clojure 
ББК 32.973-018.1

Электронное издание на основе печатного издания: Программирование на Clojure. Практика 
применения Lisp в мире Java / Ч. Эмерик, Б. Карпер, К. Гранд ; пер. с англ. А. Н. Киселёва. — 
Москва : ДМК Пресс, 2015. — 816 с. — ISBN 978-5-97060-299-7. — Текст : непосредственный.

Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было 
форме и какими бы то ни было средствами без  письменного разрешения владельцев авторских прав.
Материал, изложенный в данной книге, многократно проверен. Но поскольку вероятность технических 
ошибок все равно существует, издательство не может гарантировать абсолютную точность и правильность 
приводимых сведений. В связи с этим издательство не несет ответственности за возможные ошибки, связанные 
с использованием книги.

В соответствии со ст. 1299 и 1301 ГК РФ при устранении ограничений, установленных техническими средствами 
защиты авторских прав, правообладатель вправе требовать от нарушителя возмещения убытков или выплаты компенсации.


ISBN 978-5-89818-600-5
©  Chas Emerick, Brian Carper, and 
Christophe Grand
© Оформление, перевод ДМК Пресс, 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
Содержание

Связывание локальных значений: let ............................................. 62
Деструктуризация (let, часть 2) ...................................................... 64
Деструктуризация упорядоченных коллекций .......................... 65
Деструктуризация ассоциативных массивов ............................ 69
Создание функций: fn .................................................................... 74
Деструктуризация аргументов функций ................................... 77
Литералы функций ................................................................... 80
Выполнение по условию: if ............................................................ 82
Организация циклов: loop и recur .................................................. 83
Ссылки на переменные: var ........................................................... 85
Взаимодействие с Java: . и new  .................................................... 86
Обработка исключений: try и throw ................................................ 86
Специализированная операция set! .............................................. 87
Примитивы блокировок: monitor-enter и monitor-exit ..................... 87
Все вместе ......................................................................................... 87
eval ................................................................................................ 88
Это лишь начало ................................................................................. 90

Часть I. ФУНКЦИОНАЛЬНОЕ И КОНКУРЕНТНОЕ 
ПРОГРАММИРОВАНИЕ ................................................................ 91

Глава 2. Функциональное программирование ...................... 92

Что подразумевается под термином «Функциональное 
программирование»? ......................................................................... 93
О важности значений.......................................................................... 94
О значениях .................................................................................. 95
Сравнение значений изменяемых объектов .................................. 96
Важность выбора ........................................................................ 101
Функции, как сущности первого порядка, и функции высшего 
порядка ............................................................................................ 103
Частичное применение  ............................................................... 111
Композиция функций ....................................................................... 116
Создание функций высшего порядка........................................... 120
Создание простейшей системы журналирования 
с применением композиции функций высшего порядка  ............... 121
Чистые функции ............................................................................... 126
В чем преимущество чистых функций? ........................................ 129
Функциональное программирование в реальном мире .................... 132

Глава 3. Коллекции и структуры данных ............................... 134

Главенство абстракций над реализациями ....................................... 135
Коллекции ................................................................................... 139
Последовательности ................................................................... 142
Содержание

Последовательности не являются итераторами ..................... 145
Последовательности не являются списками .......................... 146
Создание последовательностей ............................................. 147
Ленивые последовательности ................................................ 148
Удержание мусора ................................................................. 156
Ассоциативные коллекции .......................................................... 157
Берегитесь значения nil  ......................................................... 161
Индексирование ......................................................................... 162
Стек ............................................................................................ 164
Множество .................................................................................. 165
Сортированные коллекции .......................................................... 166
Определение порядка с помощью компараторов 
и предикатов .......................................................................... 168
Упрощенный доступ к коллекциям .................................................... 173
Идиоматические приемы использования .................................... 175
Коллекции, ключи и функции высшего порядка ........................... 176
Типы структур данных ....................................................................... 177
Списки ........................................................................................ 178
Векторы ...................................................................................... 179
Векторы как кортежи .............................................................. 180
Множества .................................................................................. 181
Ассоциативные массивы ............................................................. 182
Ассоциативные массивы как специализированные 
структуры ............................................................................... 183
Другие применения ассоциативных массивов ........................ 185
Неизменяемость и сохранность ....................................................... 189
Сохранность и совместное использование.................................. 190
Визуализация сохранности: списки ........................................ 191
Визуализация сохранности: ассоциативные массивы 
(векторы и множества) ........................................................... 193
Очевидные преимущества ..................................................... 196
Переходные структуры данных .................................................... 198
Метаданные ..................................................................................... 205
Включаем коллекции Clojure в работу ............................................... 207
Идентификаторы и циклы ............................................................ 208
Думайте иначе: от императивного к функциональному ................ 210
Вспоминаем классику: игра «Жизнь» ...................................... 211
Генерация лабиринтов............................................................ 220
Навигация, изменение и зипперы (zippers) .................................. 228
Манипулирование зипперами ................................................ 229
Собственные зипперы ............................................................ 231
Зиппер Ариадны .................................................................... 232
В заключение ................................................................................... 236
Содержание

Глава 4. Конкуренция и параллелизм ................................... 237

Сдвиг вычислений в пространстве и времени ................................... 238
delay ............................................................................................ 238
Механизм future .......................................................................... 241
Механизм promise ....................................................................... 243
Параллельная обработка по невысокой цене .................................... 246
Состояние и идентичность ............................................................... 250
Ссылочные типы ............................................................................... 253
Классификация параллельных операций .......................................... 255
Атомы............................................................................................... 258
Уведомление и ограничение............................................................. 261
Функции-наблюдатели ................................................................ 261
Функции-валидаторы .................................................................. 264
Ссылки ............................................................................................. 266
Программная транзакционная память ......................................... 266
Механика изменения ссылок ....................................................... 268
Функция alter .......................................................................... 271
Уменьшение конфликтов в транзакциях с помощью commute ... 273
Затирание состояния ссылки с помощью ref-set..................... 279
Проверка локальной согласованности с помощью 
валидаторов ........................................................................... 279
Острые углы программной транзакционной памяти .................... 283
Функции с побочными эффектами строго запрещены .............. 283
Минимизируйте продолжительность выполнения транзакций ..... 284
Читающие транзакции могут повторяться .............................. 287
Искажение при записи ........................................................... 289
Переменные ..................................................................................... 291
Определение переменных ........................................................... 292
Приватные переменные ......................................................... 293
Строки документации ............................................................. 294
Константы .............................................................................. 295
Динамическая область видимости .............................................. 296
Переменные в языке Clojure не являются переменными 
в классическом понимании  ......................................................... 303
Опережающие объявления.......................................................... 305
Агенты .............................................................................................. 307
Обработка ошибок в заданиях агентов ........................................ 310
Режимы и обработчики ошибок в агентах ............................... 312
Ввод/вывод, транзакции и вложенная передача заданий ............... 313
Сохранение состояний ссылок в журнале на основе агента .... 315
Использование агентов для распределения нагрузки ............... 318
Механизмы параллельного выполнения в Java ................................. 328
Блокировки ................................................................................. 329
В заключение ................................................................................... 330
Содержание

Часть II. СОЗДАНИЕ АБСТРАКЦИЙ ......................................... 331

Глава 5. Макросы ........................................................................ 332

Что такое макрос? ............................................................................ 333
Чем не являются макросы ........................................................... 335
Что могут макросы, чего не могут функции? ................................ 336
Сравнение макросов и механизма eval в Ruby ............................. 339
Пишем свой первый макрос ............................................................. 341
Отладка макросов ............................................................................ 343
Функции развертывания макросов .............................................. 344
Синтаксис ........................................................................................ 346
Сравнение quote и syntax-quote................................................... 348
unquote и unquote-splicing ........................................................... 349
Когда следует использовать макросы ............................................... 351
Гигиена ............................................................................................ 353
Генераторы символов во спасение .............................................. 355
Предоставление пользователю права выбора имен .................... 359
Двукратное вычисление .............................................................. 360
Распространенные идиомы и шаблоны макросов ............................. 362
Неявные аргументы: &env и &form .................................................... 364
&env ............................................................................................ 364
&form .......................................................................................... 367
Вывод сообщений об ошибках в макросах.............................. 367
Сохранение определений типов, сделанных пользователем .... 370
Тестирование контекстных макросов .......................................... 373
Подробности: -> и ->> ..................................................................... 375
В заключение ................................................................................... 379

Глава 6. Типы данных и протоколы ........................................ 380

Протоколы........................................................................................ 381
Расширение существующих типов ................................................... 383
Определение собственных типов ..................................................... 389
Записи ........................................................................................ 392
Конструкторы и фабричные функции ...................................... 396
Когда использовать ассоциативные массивы, а когда записи ... 398
Типы ............................................................................................ 399
Реализация протоколов ................................................................... 402
Встроенная реализация .............................................................. 403
Встроенные реализации интерфейсов Java  ........................... 405
Определение анонимных типов с помощью reify ..................... 407
Повторное использование реализаций ....................................... 408
Интроспекция протоколов ................................................................ 413
Пограничные случаи использования протоколов .............................. 415
Содержание

Поддержка абстракций коллекций.................................................... 417
В заключение ................................................................................... 427

Глава 7. Мультиметоды ............................................................. 428

Основы мультиметодов .................................................................... 428
Навстречу иерархиям ....................................................................... 431
Иерархии ......................................................................................... 434

Независимые иерархии ............................................................... 437

Сделаем выбор по-настоящему множественным! ............................ 441
Кое что еще  ..................................................................................... 443

Множественное наследование .................................................... 443
Интроспекция мультиметодов ..................................................... 445
type и class; или месть ассоциативного массива ......................... 446
Функции выбора не имеют ограничений ...................................... 447

В заключение ................................................................................... 449

Часть III. ИНСТРУМЕНТЫ, ПЛАТФОРМЫ И ПРОЕКТЫ ........ 450

Глава 8. Создание и организация проектов на Clojure ...... 451

География проекта ........................................................................... 451

Определение и использование пространств имен ....................... 452

Пространства имен и файлы .................................................. 461
Знакомство с classpath  .......................................................... 465

Местоположение, местоположение, местоположение  ............... 467
Организация программного кода по функциональным признакам ... 469

Основные принципы организации проектов ........................... 471

Сборка ............................................................................................. 472

Предварительная компиляция ..................................................... 473
Управление зависимостями ........................................................ 476
Модель Maven управления зависимостями ................................. 477

Артефакты и координаты........................................................ 477
Репозитории .......................................................................... 479
Зависимости .......................................................................... 480

Инструменты сборки и шаблоны настройки ................................. 483

Maven ..................................................................................... 484
Leiningen ................................................................................ 488
Настройка предварительной компиляции .............................. 491
Сборка гибридных проектов ................................................... 493

В заключение ................................................................................... 496

Глава 9. Java и взаимодействие с JVM .................................. 497

JVM – основа Clojure ......................................................................... 498
Использование классов, методов и полей Java ................................ 499
Содержание

Удобные утилиты взаимодействий ................................................... 503
Исключения и обработка ошибок ..................................................... 506
Отказ от контролируемых исключений ........................................ 509
with-open, прощай finally .............................................................. 510
Указание типов для производительности ......................................... 512
Массивы .......................................................................................... 518
Определение классов и реализация интерфейсов ........................... 519
Экземпляры анонимных классов: proxy ....................................... 520
Определение именованных классов ............................................ 523
gen-class ................................................................................ 524
Аннотации ................................................................................... 532
Создание аннотированных тестов для JUnit  ........................... 533
Реализация конечных точек веб-службы JAX-RS ..................... 534
Использование Clojure из Java .......................................................... 537
Использование классов, созданных с помощью deftype 
и defrecord .................................................................................. 541
Реализация интерфейсов протоколов ......................................... 544
Сотрудничество ............................................................................... 546

Глава 10. REPL-ориентированное программирование ..... 547

Интерактивная разработка ............................................................... 547
Постоянное изменяющееся окружение ....................................... 552
Инструменты .................................................................................... 554
Оболочка REPL ............................................................................ 555
Интроспекция пространств имен ........................................... 557
Eclipse ......................................................................................... 560
Emacs.......................................................................................... 563
clojure-mode и paredit ............................................................. 564
inferior-lisp .............................................................................. 565
SLIME ..................................................................................... 567
Отладка, мониторинг и исправление программ в REPL во время 
эксплуатации ................................................................................... 570
Особые замечания по поводу «развертываемых» оболочек REPL ... 574
Ограничения при переопределении конструкций ............................. 576
В заключение ................................................................................... 579

Часть IV. ПРАКТИКУМ ................................................................. 580

Глава 11. Числовые типы и арифметика............................... 581

Числовые типы в Clojure  ................................................................... 581
В Clojure предпочтение отдается 64-битным (или больше) 
представлениям .......................................................................... 583
Clojure имеет смешанную модель числовых типов ....................... 583
Содержание

Рациональные числа ................................................................... 586
Правила определения типа результата  ....................................... 587
Арифметика в Clojure  ....................................................................... 589
Ограниченная и произвольная точность ...................................... 589
Неконтролируемые операции ..................................................... 593
Режимы масштабирования и округления в операциях 
с вещественными числами произвольной точности..................... 595
Равенство и эквивалентность ........................................................... 597
Идентичность объектов (identical?) .............................................. 597
Равенство ссылок (=)................................................................... 598
Числовая эквивалентность (==) ................................................... 600
Эквивалентность может защитить ваш рассудок .................... 601
Оптимизация производительности операций с числами .................. 603
Объявление функций, принимающих и возвращающих 
значения простых типов .............................................................. 604
Ошибки и предупреждения, вызванные несоответствием 
типов  ..................................................................................... 608
Используйте простые массивы осмысленно................................ 610
Механика массивов значений простых типов ......................... 613
Автоматизация указания типов в операциях 
с многомерными массивами .................................................. 618
Визуализация множества Мандельброта в Clojure ............................ 620

Глава 12. Шаблоны проектирования ..................................... 629
Внедрение зависимостей ................................................................. 631
Шаблон Стратегия (Strategy) ............................................................ 636
Цепочка обязанностей (Chain of Responsibility) ................................. 638
Аспектно-ориентированное программирование .............................. 642
В заключение ................................................................................... 647

Глава 13. Тестирование ............................................................. 648
Неизменяемые значения и чистые функции ..................................... 648
Создание фиктивных значений .................................................... 649
clojure.test ........................................................................................ 651
Определение тестов ................................................................... 653
«Комплекты» тестов .................................................................... 656
Крепления (fixtures) ..................................................................... 658
Расширение HTML DSL ..................................................................... 662
Использование контрольных проверок ............................................. 668
Предусловия и постусловия ........................................................ 670

Глава 14. Реляционные базы данных .................................... 673

clojure.java.jdbc ................................................................................ 673
Подробнее о with-query-results .................................................... 678
Содержание

Транзакции.................................................................................. 680
Пулы соединений ........................................................................ 681
Korma ............................................................................................... 682
Вступление ................................................................................. 683
Запросы ...................................................................................... 685
Зачем использовать предметно-ориентированный язык? .............. 686
Hibernate .......................................................................................... 689
Настройка ................................................................................... 690
Сохранение данных ..................................................................... 694
Выполнение запросов ................................................................. 695
Избавление от шаблонного кода ................................................. 695
В заключение ................................................................................... 698

Глава 15. Нереляционные базы данных ................................ 699

Настройка CouchDB и Clutch ............................................................ 700
Простейшие CRUD-операции ........................................................... 701
Представления ............................................................................ 703
Простое представление (на JavaScript) ....................................... 704
Представления на языке Clojure .................................................. 706
_changes: использование CouchDB в роли очереди сообщений ....... 711
Очереди сообщений на заказ ........................................................... 713
В заключение ................................................................................... 717

Глава 16. Clojure и Веб ............................................................... 718

«Стек Clojure» ................................................................................... 718
Основа: Ring ..................................................................................... 720
Запросы и ответы ........................................................................ 721
Адаптеры .................................................................................... 724
Обработчики ............................................................................... 725
Промежуточные функции ............................................................ 727
Маршрутизация запросов с помощью Compojure ............................. 729
Обработка шаблонов ........................................................................ 743
Enlive: преобразование HTML с применением селекторов ........... 745
Попробуем воду ..................................................................... 746
Селекторы ............................................................................. 748
Итерации и ветвление  ........................................................... 750
Объединяем все вместе ......................................................... 752
В заключение ................................................................................... 756

Глава 17. Развертывание веб-приложений на Clojure ....... 758

Веб-архитектура Java и Clojure  ........................................................ 758
Упаковка веб-приложения  .......................................................... 762
Сборка .war-файлов с помощью Maven .................................. 764
Содержание

Сборка .war-файлов с помощью Leiningen .............................. 767
Запуск веб-приложений на локальном компьютере .......................... 769
Развертывание веб-приложения ...................................................... 770
Развертывание приложений на Clojure с помощью 
Amazon Elastic Beanstalk .............................................................. 771
За пределами развертывания простых веб-приложений .................. 775

Часть V. РАЗНОЕ ......................................................................... 776

Глава 18. Выбор форм определения типов .......................... 777

Глава 19. Внедрение Clojure .................................................... 780

Только факты... ................................................................................. 780
Подчеркните особую продуктивность  .............................................. 782
Подчеркните широту сообщества ..................................................... 784
Будьте благоразумны ....................................................................... 786

Глава 20. Что дальше? ............................................................... 788

(dissoc Clojure 'JVM) .......................................................................... 788
ClojureCLR ................................................................................... 788
ClojureScript ................................................................................ 789
4Clojure ............................................................................................ 790
Overtone ........................................................................................... 790
core.logic .......................................................................................... 791
Pallet ................................................................................................ 792
Avout ................................................................................................ 793
Clojure на платформе Heroku ............................................................ 793

Об авторах .................................................................................... 795

Иллюстрация на обложке ................................................................. 796

Предметный указатель ............................................................. 797
Предисловие к русскому изданию

Вы держите в руках новую книгу, выпущенную издательством «ДМК
Пресс», которая посвящена относительно молодому языку программирования 
Clojure, объединяющим мощь Lisp с популярностью платформы JVM, 
позволяя очень быстро создавать сложные приложения.

Долгое время на русском языке было доступно небольшое количество 

материалов, например, статья «Clojure, или “Вы все еще используете Java? 
Тогда мы идем к вам!”», опубликованная в четвертом номере журнала 
«Практика функционального программирования» (http://fprog.ru/). Но постепенно 
новый язык начал набирать популярность и среди русско-язычных 
разработчиков. Одно из свидетельств этого – на вводный курс о Clojure, 
организованный Дмитрием Бушенко (https://www.facebook.com/groups/
clojure.course/), записалось почти 90 человек.

Данная книга написана разработчиками, давно работающими с Clojure и 

создавшими большое количество популярных библиотек.  Книга описывает 
как сам язык, так и основные приемы программирования на нем, очень 
часто непривычные для людей, использовавших только императивные или 
объектно-ориентированные языки.  Но непривычность языка не должна вас 
отпугивать, вы сможете использовать новые приемы не только при программировании 
на Clojure, но и в «стандартных» языках.  

Помимо описания самого языка достаточно большая часть книги посвя-

щена практическим аспектам его применения – веб-програм мированию, 
работе с базами данных, взаимодействию с кодом написанном на Java и т.д.

Если у вас возникнут вопросы по разработке на Clojure, вы можете 

задать их в группе ru_clojure в LiveJournal (http://ru-clojure.livejournal.
com/) или в списке рассылки clojure-russian (https://groups.google.com/
forum/?fromgroups#!forum/clojure-russian). Существует также аггрегатор 
русско-язычных блогов, посвященных Clojure (http://feeds.feedburner.com/
RussianClojurePlanet), а если вы заинтересованы вопросами функционального 
программирования, то найдете много полезной информации в Russian 
Lambda Planet (http://fprog.ru/planet/).

Если вы захотите продолжить знакомство с языком, то можете получить 

больше информации в основном списке рассылки Clojure (https://groups.
google.com/forum/?fromgroups#!forum/clojure), в постингах на Planet Clojure 
(http://planet.clojure.in) и других книгах, таких как «The Joy of Clojure».

Интересного чтения & happy hacking! 

Алекс Отт
Благодарности

При подготовке перевода данной книги к печати ее рукописи были 
переданы для обсуждения членам русскоязычного сообщества 
пользователей Clojure, принявшим самое деятельное участие в ее 
улучшении.

Особую благодарность издательство выражает Дмитрию Бушен-

ко, Сергею Париеву и Федору Русаку. Спасибо вам, друзья! Вашу 
помощь переоценить невозможно!
Предисловие

Clojure – динамический, строго типизированный язык программирования, 
основанный на виртуальной машине  Java (Java Virtual Machine, JVM) и 
созданный уже пять лет тому назад. Он с восторгом был воспринят программистами, 
использующими самые разные языки и работающими в самых 
разных областях. Язык Clojure обладает весьма привлекательным набором 
возможностей и характеристик, приспособленных для решения современных 
задач программирования:

 
поддержка функционального программирования, включая комплекс 

неизменяемых структур данных, по своей производительности приближающихся 
к обычным, изменяемым структурам;

 
зрелая и эффективная среда выполнения, предоставляемая JVM;

 
механизмы взаимодействий с JVM/Java, отвечающие самым широ-

ким архитектурным и эксплуатационным требованиям;

 
комплекс надежных средств поддержки параллельного выполнения и 

семантики параллельного выполнения;

 
будучи диалектом языка Lisp, предоставляет особенно гибкие и мощ-

ные средства метапрограммирования.

Язык Clojure представляет собой серьезную альтернативу для тех, кому 

постоянно приходится бороться с ограничениями обычных языков программирования 
и их окружений. Мы постараемся продемонстрировать это, 
показывая, насколько прозрачным выглядит взаимодействие Clojure с существующими 
технологиями, библиотеками и службами, используемыми 
программистами в повседневной работе. На протяжении всей книги мы 
будем знакомить вас с основами Clojure, опираясь в первую очередь на 
общественный опыт и знания, а не на (зачастую чужеродные) основные 
принципы информатики.

Кому адресована эта книга?

Мы писали эту книгу с расчетом на две категории специалистов. На-

деемся, что вы принадлежите к одной из них.

Язык Clojure не только не отстает, но и часто превосходит многие ос-

новные языки программирования по выразительности, лаконичности и 
Предисловие

гибкости, позволяя при этом пользоваться преимуществами высокой производительности, 
богатства библиотек, наличия обширного сообщества и 
устойчивости JVM. Все это делает его естественным шагом вперед для 
разработчиков программ на языке Java (и даже разработчиков для JVM,  
использующих интерпретируемые и не особенно быстрые языки программирования, 
отличные от Java), кого не устраивает низкая производительность 
или кто не может отказаться от своих инвестиций в JVM. Не менее 
естественным шагом вперед Clojure является также для разработчиков на 
Ruby и Python, которые не готовы пожертвовать выразительностью языка, 
но желающие получить более надежную и эффективную платформу выполнения 
и огромный выбор высококачественных библиотек.

Для Java-разработчиков

В мире живут и работают миллионы разработчиков на Java, но лишь 
немногие из них пишут программы для окружения, предъявляющего строгие 
требования, решая нетривиальные, часто узкоспециализированные задачи. 
Если вы относитесь к их числу, вероятно, вы постоянно находитесь 
в поисках более удобных инструментов и приемов, которые позволили бы 
повысить производительность труда, а также ценность вашего коллектива, 
организации или сообщества. Кроме того, вам, возможно, уже приходилось 
огорчаться, сталкиваясь с ограничениями в Java, отсутствующими в других 
языках, но при этом экосистема JVM не потеряла для вас своей привлекательности: 
трудно отказаться от зрелой среды выполнения, богатого выбора 
сторонних библиотек, поддержки поставщиками и огромного накопленного 
опыта, независимо от того, какими яркими не выглядели бы перспективы 
использования альтернативных языков.
В Clojure вы найдете долгожданное облегчение. Программы на этом 
языке выполняются под управлением JVM и обладают превосходной производительностью. 
Этот язык позволяет использовать любые имеющиеся 
библиотеки, инструменты и приложения. Он проще чем Java, лаконичнее и 
при этом намного выразительнее.

Для разработчиков на Ruby, Python 
и других языках

Языки Ruby и Python далеко не новые, но в последние годы они приобрели 
особую популярность (можно даже сказать: «заняли господствующее 
положение»). Не трудно понять почему: оба являются выразительными, 
динамическими языками, поддерживаются бурно разрастающимися сообществами, 
обеспечивают высокую производительность труда во многих сферах.
Для вас язык Clojure также является естественным выбором. Как программист 
на Ruby или Python вы, вероятно, не желаете терять мощь этих языков, 
но вы можете испытывать потребность в более надежной платформе, обла-
Как читать эту книгу

дающей более высокой производительностью и богатым выбором библиотек. 
Язык Clojure, основанный на JVM, целиком и полностью отвечает этим требованиям – 
он полностью соответствует, а иногда и превосходит другие языки 
по своей выразительности и способности повышать производительность труда 
разработчика.

Примечание. Мы часто будем сравнивать Clojure с Java, Ruby и Python, 
чтобы помочь вам перенести свой опыт на Clojure. В таких сравнениях мы 
всегда будем подразумевать канонические реализации этих других языков:
 
Ruby MRI (также называется, как CRuby);
 
CPython;
 
Java 6/7.

Как читать эту книгу

Работая над этой книгой, мы хотели как можно больше наполнить ее конкретными, 
подробными и практическими примерами, достаточно понятными, 
чтобы вы могли избежать ошибок. Мы не раз сталкивались с книгами, 
где от начала до конца рассматривался пример разработки единственной 
программы или приложения. Такой подход, на наш взгляд, разрушает целостность 
повествования и вынуждает авторов от главы к главе исследовать 
вымученный «практический» пример, который может не соответствовать 
кругу задач, решаемых читателем.
Учитывая это, мы разделили книгу на две основные части, и одну вступительную, 
где излагаются основы языка, занимающими примерно две трети 
книги. За ними следует четвертая часть с большим количеством практических 
примеров из разных прикладных областей. Такое деление на части 
с совершенно разным содержимым позволяет квалифицировать эту книгу, 
как «книгу двойного назначения». (Автором этого термина, возможно, является 
Мартин Фаулер (Martin Fowler), употребивший его в статье http://
martinfowler.com/bliki/DuplexBook.html.) В любом случае, мы предполагаем 
два подхода к чтению этой книги.

Начните с практического применения 
Clojure

Часто лучший способ изучить язык заключается в том, чтобы применить 
его на практике. Если такой подход кажется вам более привлекательным, 
есть шанс, что вы найдете в книге пару практических примеров, демонстрирующих 
решение задач, с которыми вам приходится сталкиваться ежедневно, 
благодаря которым вы сможете провести параллели в решении некоторых категорий 
задач на используемом вами языке (или языках) и на языке Clojure. 
В этих примерах вы можете столкнуться с большим количеством не известных 
вам понятий и языковых конструкций. В подобных ситуациях, для по-
Предисловие

нимания новых концепций, используйте в качестве отправной точки контекст 
предметной области и учебный материал в первой части книги.

Начните с последовательного изучения 
основ языка Clojure

Иногда, чтобы по-настоящему разобраться в чем-то, необходимо доско-

нально изучить внутреннее устройство, начиная с самых основ. Если вы 
предпочитаете такой подход, тогда лучше будет начать «переваривать» эту 
книгу с самого начала, с первой страницы в главе 1. Мы постарались последовательно 
и подробно объяснить все основополагающие принципы и 
конструкции языка Clojure, поэтому вам редко придется заглядывать вперед, 
чтобы понять концепции, встречающиеся раньше их описания. Выбирая 
подход последовательного освоения основ языка Clojure, не стесняйтесь 
забегать вперед и заглядывать в практическую часть книги, где вы найдете 
интересные примеры, схожие с задачами, решаемыми вами.

Кто мы?

Мы – три разработчика программного обеспечения (ПО), разными пу-

тями пришедшие в Clojure и осознавшие его ценность. В процессе работы 
над книгой мы старались вложить в нее все наши представления о том, как 
и почему следует использовать Clojure, чтобы вы с успехом смогли применять 
его на практике.

Чаз Эмерик 

Чаз Эмерик (Chas Emerick) стал постоянным членом сообщества Clojure 

в начале 2008. Занимался разработкой ядра языка, принимал участие в десятках 
проектов с открытым исходным кодом на языке Clojure, а также 
часто выступал и писал статьи о языке Clojure и разработке ПО в целом.

Чаз занимается сопровождением проекта Clojure Atlas (http://clojureatlas.

com) визуализации языка Clojure и его стандартной библиотеки с целью 
обуче ния.

Является основателем Snowtide (http://snowtide.com), небольшой компа-

нии в Западном Массачусетсе, занимающейся производством ПО. Основной 
круг интересов Чаза лежит в области извлечения неструктурированных 
данных с уклоном в обработку документов PDF. Он пишет статьи и книги 
о Clojure занимается разработкой ПО и предпринимательством, а также 
имеет другие пристрастия (http://cemerick.com).

Брайен Карпер

Брайен Карпер (Brian Carper) – программист на Ruby, ставший привер-

женцем Clojure. Занимается программированием на Clojure, начиная с 2008, 
Доступ онлайн
719 ₽
В корзину