Clojure
| Clojure | |
|---|---|
| | |
| Klasa jezykowa | funkcjonalny , wieloparadygmat |
| Pojawił się w | 2007 |
| Autor | Bogaty Hickey |
| Deweloper | Hickey, Richard |
| Rozszerzenie pliku |
.clj, .cljs, .cljc, .ednlub.cljr |
| Wydanie | 1.11.1 ( 5 kwietnia 2022 ) |
| Wpisz system | dynamiczny, ścisły |
| Byłem pod wpływem | Lisp , ML , Haskell , Erlang [1] , Prolog , Schemat , Java , Ruby [2] |
| pod wpływem | Eliksir |
| Licencja | Licencja Publiczna Eclipse |
| Stronie internetowej | clojure.org |
| Pliki multimedialne w Wikimedia Commons | |
Clojure (wymawiane zamknięcie [ˈklōZHər]) to nowoczesny dialekt Lisp , języka programowania ogólnego przeznaczenia z obsługą interaktywnego rozwoju, który zachęca do programowania funkcjonalnego i ułatwia wielowątkowość . Clojure działa na platformach JVM i CLR . Clojure wyróżnia się filozofią "kodu jako danych" ( homoicon ) oraz rozwiniętym systemem makr Lisp .
Tłumacz Clojure jest swobodnie rozpowszechniany na warunkach Licencji Publicznej Eclipse .
Filozofia
Rich Hickey zaprojektował Clojure jako nowoczesny Lisp do programowania funkcjonalnego z integracją z platformą Java , zaprojektowany do obsługi współbieżności . [3]
Składnia
Jak każdy inny Lisp, składnia Clojure opiera się na wyrażeniach S , które są tłumaczone na struktury danych przez parser przed kompilacją . Parser Clojure obsługuje, oprócz zwykłych list, składnię dosłowną dla tablic asocjacyjnych , zestawów i wektorów , przekazując wszystkie te struktury danych do kompilatora . Innymi słowy, kompilator Clojure nie tylko kompiluje struktury danych list, ale bezpośrednio obsługuje wszystkie określone typy.
Chociaż Clojure jest rozszerzeniem oryginalnej wersji Lispu , nie jest kompatybilny z Lispem, czyli programem w żadnej z nowoczesnych wersji Lispu (może z wyjątkiem najkrótszej, najbardziej prymitywnej, a ponadto specjalnie dobranej przykłady) lub wcale, tłumacz Clojure przejdzie lub nie wykona się poprawnie. Różnice w stosunku do popularnych wersji Lisp są wymienione na stronie językowej [4] . Oto niektóre z nich:
- w identyfikatorach rozróżniana jest wielkość liter;
- oryginalna składnia literałów, wektorów, odwzorowań (map), wyrażeń regularnych , funkcji anonimowych i szeregu innych elementów składniowych;
- traci się niejednoznaczność wartości nil (co w Lispie oznacza zarówno wskaźnik null, jak i pustą listę oraz wartość logiczną „false”) - oznacza ona tylko brak wartości (puste odwołanie, jak null w Javie), specyficzne składnia jest używana dla innych wartości;
- wiele tradycyjnych funkcji zmieniło nazwy, na przykład car i cdr zostały zastąpione przez first i rest;
- obsługiwane są funkcje o tej samej nazwie z różnymi zestawami argumentów;
- brak makr odczytu (makr odczytu), co uniemożliwia zmianę składni języka;
- część pozostałych niezmienionych elementów składniowych zmieniła znaczenie;
- było wsparcie dla „leniwych” kolekcji.
Makra
System makr Clojure jest bardzo podobny do systemu makr Common Lisp , z dwoma wyjątkami:
- Podczas rozwijania formularzy pod znakiem tylnego cudzysłowu
`( ang. back quote ), który w Clojure nazywany jest terminem "składnia-cytat", każdy znak jest automatycznie jawnie kwalifikowany przez przestrzeń nazw, do której należy w punkcie definicji makra. Taka kolejność wyklucza przypadkowe połączenie z symbolem o tej samej nazwie z „obcej” przestrzeni nazw przy rozwijaniu makra. W makrze można odwoływać się do symbolu z innej przestrzeni nazw, ale tylko przez jego jawne zakwalifikowanie. - Aby wyróżnić obliczenia pośrednie pod tylnym znakiem cudzysłowu , zamiast
,i , i,@są używane odpowiednio .~~@
Cechy języka
- Dynamiczny, interaktywny rozwój w cyklu REPL
- Funkcjonuje jako obiekty pierwszej klasy z naciskiem na rekurencję , a nie iterację opartą na efektach ubocznych
- " Leniwe " sekwencje
- Zapewnia bogaty , trwałych danych
- Programowanie równoległe z obsługą pamięci transakcyjnej , systemu agentowego i systemu zmiennych dynamicznych
- Clojure jest językiem skompilowanym , wynikiem kompilacji jest kod bajtowy JVM
- Ścisła integracja z Javą : dzięki kompilacji do kodu bajtowego JVM, programy Clojure można łatwo przenieść do dowolnego środowiska obsługującego JVM. Język udostępnia również szereg makr, które ułatwiają korzystanie z istniejących w nim interfejsów API Javy . Struktury danych Clojure implementują wszystkie standardowe interfejsy Java, ułatwiając uruchamianie kodu Clojure z Java.
Przykłady
( println "Witaj świecie!" )
Bezpieczny wątkowo unikalny generator numerów seryjnych:
( let [i ( atom 0 ) ]
( defn generate-unique-id
"Zwraca inny numeryczny identyfikator dla każdego wywołania."
[]
( swap! i inc )))
Anonimowa podklasa java.io.Writer, która niczego nie wyświetla, oraz makro używane do wyciszania wszystkich zawartych w niej danych wyjściowych:
( def bit-bucket-writer
( proxy [java.io.Writer] []
( write [buf] nil )
( close [] nil )
( flush [] nil )))
( defmacro noprint
"Ocenia podane wyrażenia, wyciszając wszystkie *wyjście* na ekran." .
[& formularze]
` ( wiązanie [*out* bit-bucket-writer]
~@forms ))
( noprint
( println "Witaj, nikt!" ))
10 wątków manipulujących jedną wspólną strukturą danych, która składa się ze 100 wektorów, z których każdy zawiera 10 (początkowo kolejnych) unikalnych liczb. Każdy wątek wielokrotnie wybiera dwie losowe pozycje w dwóch losowych wektorach i zamienia ich wartości. Wszystkie zmiany wektora zachodzą w jednej transakcji przy użyciu systemu pamięci transakcyjnej clojure . Dlatego nawet po 1000 iteracji żadne liczby nie są tracone w każdym z wątków.
( defn run [nvecs nitems nthreads niters]
( let [vec-refs ( vec ( map ( comp ref vec ) )
( partycje nite ( zakres ( * nvecs nites )))))
swap #( let [v1 ( rand-int nvecs )
v2 ( rand-int nvecs )
i1 ( rand-int nitems )
i2 ( rand-int nitems ) ]
( dosync
( let [ temp ( nth @ ( vec-refs v1 ) i1 ) ]
( alter ( vec-refs v1 ) assoc i1 ( nth @ ( vec-refs v2 ) i2 ))
( alter ( vec-refs v2 ) assoc i2 temp ))))
report #( do
( prn ( map deref vec-refs ))
( println "Distinct:"
( count ( differ ( zastosuj concat ( map deref vec-refs )))))) ]
( raport )
( dorun ( zastosuj pcals ( powtórz nwątki #( dotimes [_ niters] ( swap ))))))
( raport )))
( bieg 100 10 10 100000 )
Wynik poprzedniego przykładu:
( [0 1 2 3 4 5 6 7 8 9] [10 11 12 13 14 15 16 17 18 19] ...
[990 991 992 993 994 995 996 997 998 999] )
Wyraźne: 1000
( [382 318 466 963 619 22 21 273 45 596] [808 639 804 471 394 904 952 75 289 778] ...
[484 216 622 139 651 592 379 228 242 355] )
Wyraźne: 100
Zobacz także
Notatki
- ↑ Bogaty Hickey. Książki, które wpłynęły na Clojure (link niedostępny) (30 czerwca 2009). Pobrano 11 września 2009. Zarchiwizowane z oryginału w dniu 18 kwietnia 2012.
- ↑ Programowanie Clojure . Pobrano 30 kwietnia 2013 r. Zarchiwizowane z oryginału 21 maja 2015 r.
- ↑ Uzasadnienie (łącze w dół) . Bogaty Hickey . clojure.org. Źródło 17 października 2008. Zarchiwizowane z oryginału w dniu 18 kwietnia 2012.
- ↑ Różnice między Clojure i Lisp . Pobrano 23 października 2017 r. Zarchiwizowane z oryginału 8 lipca 2019 r.
Literatura
- Halloway, Stuart (28 maja 2009), Programowanie Clojure (wyd. 1), Pragmatic Bookshelf , s. 304, ISBN 1934356336 , < http://pragprog.com/titles/shcloj/programming-clojure > Zarchiwizowane 12 lutego 2010 w Wayback Machine
- VanderHart, Luke (7 czerwca 2010), Practical Clojure (wyd. 1), Apress , s. 350, ISBN 1430272317 , < http://www.apress.com/book/view/9781430272311 > . Źródło 19 lutego 2010. Zarchiwizowane 17 września 2010 w Wayback Machine
- Rathore, Amit (początek 2011), Clojure w działaniu (wyd. 1), Manning , s. 475, ISBN 9781935182597 , < http://www.manning.com/rathore/ >
- Fogus, Michael & Houser, Chris (grudzień 2010), Radość z Clojure (wyd. 1), Manning , s. 300, ISBN 9781935182641 , < http://www.manning.com/fogus/ >
Linki
- Oficjalna strona Clojure
- Repozytorium kodu Clojure na GitHub
- Clojure - Programowanie funkcjonalne dla JVM (angielski) - szczegółowy przegląd języka
- Pełna Disclojure - Demo wideo
- Po rosyjsku
- Język programowania Clojure — wprowadzenie do IBM developerWorks
- Alex Ott. Clojure lub „Czy nadal używasz Javy? Potem idziemy do ciebie!” w 4 numerze czasopisma „The Practice of Functional Programming” ( Zaktualizowana wersja artykułu , z opisem wersji 1.2)
- Forum o Clojure na lisper.ru
ru_clojure - społeczność "Clojure" w "LiveJournal"- Rosyjska planeta Clojure — agregator rosyjskojęzycznych blogów o Clojure