Clojure
Clojure – współczesny, dynamiczny język programowania oparty na Lisp, uruchamiany na maszynie wirtualnej JVM oraz w środowiskach JavaScript dzięki projektowi ClojureScript. Jego twórcą jest Rich Hickey, a język jest szczególnie ceniony w środowiskach zajmujących się programowaniem funkcyjnym, przetwarzaniem równoległym i systemami o wysokiej dostępności.
Historia
Clojure zostało zaprezentowane po raz pierwszy w 2007 roku na konferencji JVM Language Conference. Autor, Rich Hickey, chciał stworzyć język łączący prostotę i moc Lisp z możliwościami platformy Java, w szczególności jej bogatym ekosystemem bibliotek i stabilnym środowiskiem uruchomieniowym. Pierwsza stabilna wersja 1.0 ukazała się w 2010 roku, a od tego czasu język jest rozwijany otwarto‑źródłowo na licencji EPL.
Charakterystyka i podstawowe założenia
- Immutability – domyślna niezmienność struktur danych, co ułatwia programowanie współbieżne.
- Homoikoniczność – kod i dane są reprezentowane w tej samej strukturze (listy), co umożliwia łatwe przetwarzanie kodu jako danych (makra).
- Interoperacyjność z Java – bezpośredni dostęp do klas i metod z Java, co pozwala korzystać z istniejących bibliotek.
- Współbieżność – wbudowane abstrakcje, takie jak agents, atoms, refs i software transactional memory (STM), zapewniające bezpieczne przetwarzanie wielowątkowe.
- REPL (Read–Eval–Print Loop) – interaktywne środowisko programistyczne umożliwiające natychmiastowe testowanie fragmentów kodu.
Składnia
Podobnie jak inne języki z rodziny Lisp, Clojure używa notacji prefiksowej i bardzo prostych konstrukcji syntaktycznych:
(defn suma [a b] (+ a b)) ; definicja funkcji
(suma 3 4) ; wywołanie → 7
Podstawowymi elementami są:
defidefn– tworzenie stałych i funkcji.let– wiązanie lokalnych wartości.if,cond– konstrukcje warunkowe.map,reduce,filter– operacje na kolekcjach.defmacro– definiowanie makr, czyli kodu generującego kod.
Ekosystem i biblioteki
Clojure posiada rozbudowany zestaw bibliotek, dostępnych głównie poprzez narzędzie Leiningen oraz nowszy Clojure CLI. Najważniejsze z nich to:
- Ring – interfejs do budowy aplikacji webowych.
- Compojure – mikrofinał framework oparty na Ring.
- Reagent – biblioteka do tworzenia interfejsów UI w stylu React w ClojureScript.
- core.async – kanały i makra ułatwiające programowanie asynchroniczne.
- spec – system do definiowania i weryfikacji kontraktów funkcji.
ClojureScript
W 2011 roku powstał projekt ClojureScript, który kompiluje kod Clojure do JavaScript. Dzięki temu można pisać aplikacje front‑endowe (np. w React) oraz korzystać z rozwiązań serwer‑side w jednym języku.
Porównanie z innymi językami
| Cecha | Clojure | Haskell | Scala | Java |
|---|---|---|---|---|
| Model pamięci | Immutability + STM | Czyste funkcje | Immutability + Option | Mutable by default |
| Interoperacyjność | Pełna z Java | Ograniczona (via FFI) | Pełna z Java | Natychmiastowa |
| REPL | Wbudowany | GHCi | Ammonite, sbt console | JShell |
| Makra | Tak | Template Haskell | Makra (Scala 3) | Brak |
Zastosowania
Clojure jest wykorzystywane w różnych dziedzinach:
- Systemy rozproszone – np. Kafka (klienci Clojure), ZooKeeper (biblioteka zookeeper-clj).
- Analiza danych – biblioteki Incanter i Spark w wersji spark-clojure.
- Web development – serwisy oparte na Ring, Compojure, Pedestal.
- Szybkie prototypowanie – dzięki REPL oraz krótkiej składni.
Przykładowy kod
(ns przyklad.core
(:require [clojure.string :as str]))
(def dane [{:imie "Anna" :wiek 28}
{:imie "Bartek" :wiek 35}
{:imie "Celina" :wiek 22}])
(defn powitanie [osoba]
(str "Cześć, " (:imie osoba) "! Masz " (:wiek osoba) " lat."))
;; Filtrujemy osoby powyżej 25 lat i wypisujemy powitania
(doseq [osoba (filter #(> (:wiek %) 25) dane)]
(println (powitanie osoba)))
Środowiska programistyczne
Do pracy z Clojure najczęściej używa się następujących edytorów i IDE:
- Emacs z pakietem CIDER
- IntelliJ IDEA (wtyczka Cursive)
- Visual Studio Code (rozszerzenie Calva)
Licencja i społeczność
Clojure jest wydany na licencji EPL, co umożliwia zarówno komercyjne, jak i otwarto‑źródłowe wykorzystanie. Społeczność skupia się wokół blogów, list mailingowych (clojurians), spotkań Clojure/conj oraz konferencji EuroClojure. Projekty open‑source są hostowane na platformie Git (repozytoria publiczne).
Bibliografia
- Rich Hickey, “Clojure: A Modern Lisp”. – Oficjalna dokumentacja języka.
- Stuart Halloway, “Programming Clojure”. – Kompletny podręcznik dla początkujących.
- Alex Miller, “ClojureScript: A Practical Introduction”. – Materiał wprowadzający do ClojureScript.
W artykule użyto licznych linków wewnętrznych, które umożliwiają szybkie przejście do powiązanych tematów w encyklopedii.