Proponuję również przyjrzeć się Christophe'owi Grandowi: thread safe blocking queue; Jest mniej niż 20 linii, ale ma wiele funkcjonalności i, moim zdaniem, demonstruje wykorzystanie niektórych funkcji współbieżności, niezmienności, atomów i leniwych sekwencji Clojure.
uważają, że alternatywą Java java.util.concurrent.LinkedBlockingQueue is 842 lines z subtelnym (zapewne kompleks) skomentował kod i zaczynasz rozumieć jak Clojure naprawdę nie dostarcza na jego współbieżności obietnicy; znacznie podnosząc poziom abstrakcji i dostarczając prawidłową implementację przy około 10-20 razy mniejszej ilości kodu.
Zauważysz również, że podczas czytania kodu Java naprawdę trudno jest dostrzec las dla drzew ... Jeśli dostałeś go, możesz być pewny jego poprawności, patrząc na niego? Należy również pamiętać, że ten kod został napisany przez Douga Lea (prawdopodobnie najważniejszego eksperta w dziedzinie Java Concurrency) i jest wysoce czytelny w języku java; Bardzo wątpię, czy mógłbym szybko napisać czytelny kod wykonawczy, taki jak ten, w Javie i mieć pewność jego poprawności.
Porównaj to z wersją Clojure i po zapoznaniu się z podstawami gry Clojure łatwo jest rozszyfrować i zrozumieć, jak to działa ... W ciągu 20 minut byłem w stanie zrozumieć każdą linię implementacji i być pewnym jej poprawność. A teraz, gdy jestem znacznie bardziej zaznajomiony z idiomami Clojure i FP, przypuszczam, że teraz zajmie mi to 5 minut. Prawdopodobnie byłbym też w stanie napisać "poprawny" kod w Clojure w ciągu kilku godzin lub minut.
Christophes clojure wrapper z powyższej klasy java jest również pouczający, ponieważ ma ten sam interfejs funkcjonalny co pierwsza wersja.
Ładny blog opisujący funkcje: https: //perkss.github.io/#/clojure/ConcurrencyClojure # text-body – Matt