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ą (kwiecień, 2021) przeredagowane zostały części 1–16.

5Systemy typów


Grafika

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.

13Stan, tożsamość i zmiana


Grafika

Clojure jest językiem o solidnych fundamentach teoretycznych. W tej części zajmiemy się podstawami koncepcyjnymi tego dialektu Lispu, a dokładniej definicjami stanu, tożsamości, powiązania i wartości. Pozwoli nam to oswoić się z paradygmatem funkcyjnym i zrozumieć dlaczego niektóre oczywiste czynności wymagają przeprowadzania operacji niestosowanych w innych językach programowania.

15Współbieżność


Grafika

Wykonywanie współbieżne pozwala spożytkować więcej niż jedną jednostkę obliczeniową komputera podczas wykonywania zadań, które można zrównoleglić. Pomaga też lepiej zarządzać czasem, gdy pewne operacje muszą oczekiwać na obsługę komunikacji międzyprocesowej lub podsystemu wejścia/wyjścia. Clojure proponuje przejrzystą implementację wykonywania współbieżnego, wykorzystującą typy referencyjne i programową pamięć transakcyjną.

16Współbieżność: Atomy


Grafika

Atom to typ referencyjny przeznaczony do obsługi danych przetwarzanych współbieżnie, do których wymagany jest niekoordynowany, synchroniczny dostęp. Możemy dzięki niemu tworzyć współdzielone obiekty wyrażające zmieniające się stany, gdy zależy nam na tym, aby podczas zmiany wartości bieżącej uwzględniona była jej poprzednia wartość, chociaż dopuszczamy drobne zmiany w kolejności operacji, gdy więcej niż jedna aktualizacja zostanie zlecona w podobnym czasie.

17Współbieżność: Agenty


Grafika

Agent to typ referencyjny podobny do Atomu. Pozwala wyrażać częste, niekoordynowane zmiany stanów współdzielonych tożsamości w asynchroniczny sposób. Wykorzystywany bywa na przykład do obsługi niezależnych zdarzeń bądź jednokierunkowej komunikacji między komponentami realizującymi dostęp do pewnego zasobu, jak np. równoległe pobieranie danych z sieci, zapis do pliku przez wiele wątków itp.

18Współbieżność: Referencje


Grafika

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).

20Makra


Grafika

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.

21Polimorfizm


Grafika

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 .
Tematyka: