**Установка: несколько путей.**
Самый простой и рекомендуемый способ для начала — использовать **Clojure CLI tools** и **deps.edn**. Это официальный набор инструментов от сообщества Clojure, который заменил устаревший Leiningen для многих сценариев.
- **Установка на macOS/Linux:** Часто достаточно менеджера пакетов. Например, через Homebrew: `brew install clojure/tools/clojure`. Или используя официальный скрипт установки.
- **Установка на Windows:** Рекомендуется использовать WSL (Windows Subsystem for Linux) и следовать инструкциям для Linux. Альтернативно — установить вручную, скачав jar-файл и создав bash-скрипт.
- **Проверка:** После установки выполните в терминале `clojure --version`. Вы должны увидеть версию CLI tools и ядра Clojure.
**Первый запуск и REPL.**
Сила Clojure раскрывается в интерактивной разработке через REPL (Read-Eval-Print Loop). Запустите его из папки с `deps.edn`:
`clojure` или `clj` (последняя команда включает улучшенный запуск через rlwrap для истории команд).
Вы увидите приглашение `user=>`. Это среда, где вы можете выполнять любой код Clojure. Попробуйте базовые операции:
```
user=> (+ 1 2 3)
6
user=> (str "Hello, " "Clojure!")
"Hello, Clojure!"
```
REPL — это не просто консоль, это интерактивная среда для исследования, прототипирования и отладки, интегрируемая с редакторами.
**Практический пример 1: Работа с коллекциями.**
Создайте файл `src/core.clj`. В Clojure пространства имен (namespaces) соответствуют структуре папок. Добавьте в файл:
```
(ns core) ; объявление пространства имен
(defn process-orders
"Фильтрует завершенные заказы и вычисляет общую сумму."
[orders]
(let [completed (filter #(= (:status %) :completed) orders)
amounts (map :amount completed)]
(reduce + amounts)))
;; Пример вызова в REPL:
;; (require '[core :as c])
;; (def orders [{:id 1 :amount 100 :status :pending}
;; {:id 2 :amount 200 :status :completed}
;; {:id 3 :amount 50 :status :completed}])
;; (c/process-orders orders) ; => 250
```
Здесь показаны ключевые концепции: неизменяемые структуры данных (векторы, мапы), функции высшего порядка (`filter`, `map`, `reduce`), ключевые слова (`:status`), локальные связывания (`let`).
**Практический пример 2: Многопоточность с атомами.**
Одна из "суперсил" Clojure — простые примитивы для безопасного параллелизма. `atom` — это контейнер для изменяемого ссылочного типа, обновляемого транзакционно.
```
(ns counter)
(def click-count (atom 0)) ; создаем атом с начальным значением 0
(defn add-click!
"Безопасно увеличивает счетчик кликов."
[]
(swap! click-count inc)) ; swap! атомарно применяет функцию inc к значению атома
;; В REPL:
;; (require '[counter :as cnt])
;; (future (dotimes [_ 1000] (cnt/add-click!))) ; запускаем 1000 инкрементов в отдельном потоке
;; (future (dotimes [_ 1000] (cnt/add-click!))) ; еще один поток
;; Через некоторое время:
;; @cnt/click-count ; разыменовываем атом -> 2000 (без гонок данных!)
```
Это пример, где мощь иммутабельных данных и управляемых изменяемых ссылок (`atom`, `ref`, `agent`) упрощает параллельное программирование.
**Сборка и запуск скрипта.**
Для создания исполняемого jar-файла потребуется больше инструментов (например, `tools.build`). Но для запуска отдельного файла как скрипта используйте:
`clojure -M -m core`
Предварительно добавьте в `deps.edn` алиас `:exec-fn` или укажите главное пространство имен в команде.
**Интеграция с редактором.**
Для продуктивной работы необходима интеграция REPL с редактором. Плагины:
* **VS Code + Calva:** Лучший выбор для начинающих. Отличная интеграция, управление REPL, дебаггинг.
* **IntelliJ IDEA + Cursive:** Мощная коммерческая плагина, популярная среди профессионалов.
* **Emacs + CIDER / Vim + fireplace:** Классика для энтузиастов.
Они позволяют отправлять код из редактора прямо в запущенный REPL, получая мгновенный feedback, что является краеугольным камнем разработки на Clojure.
Установка Clojure с помощью CLI tools открывает дверь в мир выразительного функционального программирования на JVM. Начиная с простых операций в REPL и переходя к созданию функций для обработки данных и работы с безопасным параллелизмом, вы осваиваете парадигму, где код — это данные, а неизменяемость — основа надежности.
Комментарии (10)