Poczytaj mi Clojure

Podręcznik programowania

Grafika

„Poczytaj mi Clojure” to podręcznik programowania w jednym z bardziej elastycznych i ekspresywnych języków służących do komunikacji człowieka z maszyną.

Clojure jest stworzonym przez Richa Hickeya dialektem języka Lisp, którego wzorcowa implementacja działa pod kontrolą maszyny wirtualnej Javy (ang. Java Virtual Machine, skr. JVM). Jest dynamicznie typizowanym językiem ogólnego przeznaczenia z odśmiecaniem pamięci i obsługą typu funkcyjnego. Poza formalizmem, siłą wyrazu i zwięzłością Lispu mamy pełen dostęp do ekosystemu Javy, możemy więc korzystać zarówno z wewnętrznych klas i ich metod, jak i z wielu dodatkowych, zewnętrznych bibliotek.

Clojure to przede wszystkim język funkcyjny (większość konstrukcji to funkcje lub elementy zachowujące się jak funkcje), chociaż dzięki obsłudze współdzielonych, zmiennych stanów i możliwościom operowania na obiektach możemy go nazwać językiem wieloparadygmatowym.

Zaprojektowany z myślą o wykonywaniu współbieżnym (ang. concurrent) Clojure realizuje ten cel dając programiście do dyspozycji trwałe (ang. persistent) struktury danych, w oparciu o które obsługiwane są dane niemutowalne (ang. immutable). Kiedy jednak zachodzi konieczność wyrażania stałych tożsamości, których stany mogą się zmieniać, do dyspozycji jest kilka tzw. typów referencyjnych.

Od jakiegoś czasu Clojure wykorzystywany jest w programowaniu zastosowań sieciowych, na przykład przy budowaniu aplikacji webowych z asynchroniczną komunikacją. Stąd rosnące zainteresowanie nim, szczególnie wśród tych, którzy programują również w Pythonie, Rubym, F# bądź Javie.

Od autora

Podręcznik ten był pierwotnie notatkami tworzonymi na potrzeby własne, pomocnymi w procesie nauki języka. Pierwsze zapiski umieszczałem w serwisach społecznościowych, a po kilku tygodniach postanowiłem zadbać o strukturę i formę, publikując treści w reaktywowanym m.in. z tej okazji serwisie.

Mam nadzieję, że samouczek przyda się każdemu, kto chce poznać Clojure i spróbować funkcyjnego stylu programowania. Nawet gdyby ten konkretny język nie okazał się strzałem w dziesiątkę, jeżeli chodzi o potrzeby praktycznych zastosowań, to z pewnością jego znajomość rozwinie lepsze umiejętności kodowania we wszystkich innych.

Dotychczas stworzony materiał podzielony jest na części (dokumenty hipertekstowe), a każda z nich zawiera przynajmniej jeden rozdział, poświęcony konkretnemu zagadnieniu ogólnemu. Podręcznik nie jest jeszcze kompletny, a w tym miejscu będę dodawał nowe rozdziały w miarę ich powstawania.

Nota prawna

„Poczytaj mi Clojure” jest utworem w rozumieniu prawa autorskiego i zastrzegam sobie do niego wszelkie prawa. Póki co nie zgadzam się na powielanie, rozpowszechnianie i publiczne wykonywanie. Może kiedyś zdecyduję się uwolnić część lub całość, albo wydać w innej formie.

Umieszczam ten podręcznik w Sieci, ponieważ pisanie nie jest moim głównym sposobem zarabiania na utrzymanie, a marże wydawnictw i dystrybutorów są zbyt duże, żeby na tę chwilę opłacało mi się z nimi współpracować. Moim skromnym marzeniem jest, aby ten zbiór tekstów zawierał tyle samo lub więcej wiedzy, niż każda wydana w języku polskim książka o Clojure, którą można kupić.

Wydanie drugie

Umieszczone poniżej odnośniki do kolejnych odcinków są pierwszą edycją podręcznika aktualizowaną na bieżąco do wydania drugiego. Na chwilę obecną (czerwiec, 2019) przeredagowane zostały części 1–5.

Typy danych pozwalają klasyfikować wartości pod względem różnych cech i wykształcać relacje między tak powstałymi klasami. Programiście pomaga to definiować operacje przeprowadzane na danych różnych rodzajów, a mechanizmom języka zarządzać pamięcią i wykrywać niektóre rodzaje błędów. W Clojure mamy do czynienia z kilkoma powiązanymi ze sobą systemami typów, które możemy rozszerzać, a wykorzystując ich polimorficzne mechanizmy jesteśmy w stanie abstrahować zarządzanie danymi i budować ujednolicone interfejsy wymiany informacji.

Wykonywanie współbieżne pozwala spożytkować moc obliczeniową więcej niż jednego procesora lub rdzenia, pomaga też w lepszym zarządzaniu czasem obliczeniowym, gdy niektóre operacje muszą oczekiwać na obsługę komunikacji międzyprocesowej lub podsystemu wejścia/wyjścia. Clojure proponuje przejrzystą i wygodną implementację wykonywania współbieżnego, wykorzystującą typy referencyjne i programową pamięć transakcyjną.

Agent to typ referencyjny podobny do Atomu. Dzięki niemu można wyrażać częste, niekoordynowane zmiany stanów współdzielonych tożsamości w asynchroniczny sposób. Wykorzystywane są na przykład do obsługi niezależnych zdarzeń czy jednokierunkowej komunikacji między komponentami realizującymi dostęp do jednego zasobu (równoległe pobieranie danych z sieci, zapis do jednego pliku przez wiele wątków itp.).

Ref to typ referencyjny, dzięki któremu można wyrażać częste i jednoczesne zmiany stanów wielu współdzielonych tożsamości w synchroniczny sposób. Wykorzystywany jest tam, gdzie kilka wartości wskazywanych przez referencje zależy od siebie i modyfikacja ich wszystkich powinna być atomowa (np. przekazywanie środków między rachunkami bankowymi). Do obsługi Refów intensywnie wykorzystywana jest programowa pamięć transakcyjna (STM).

Makra to jeden z mechanizmów metaprogramowania – zbioru technik umożliwiających odczytywanie, tworzenie i modyfikowanie programów przez inne programy lub przez nie same. Są one jedną z charakterystycznych cech dialektów języka Lisp, pozwalając na przekształcanie kodu źródłowego programu zanim dojdzie do jego ewaluacji. Dzięki makrom jesteśmy budować tzw. języki dziedzinowe, dostosowane do wyrażania specyficznych rozwiązań problemów w zwięzły i przejrzysty sposób.

Polimorfizm to zbiór mechanizmów, dzięki którym te same konstrukcje języków programowania mogą być używane w odniesieniu do danych różnych rodzajów. Dzięki niemu możemy przetwarzać informacje z użyciem wyabstrahowanych, generycznych operacji, zyskując na czasie i czytelności kodu. Polimorfizm w Clojure to przede wszystkim obsługa wieloargumentowości, multimetod, protokołów i rekordów, a także korzystanie z interfejsów Javy.

Jesteś w sekcji