close

Clojure

Przejdź do nawigacji Przejdź do wyszukiwania
Clojure
Obraz logo
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

Przykłady

witaj świecie :

( 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

  1. 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. 
  2. Programowanie Clojure . Pobrano 30 kwietnia 2013 r. Zarchiwizowane z oryginału 21 maja 2015 r.
  3. Uzasadnienie (łącze w dół) . Bogaty Hickey . clojure.org. Źródło 17 października 2008. Zarchiwizowane z oryginału w dniu 18 kwietnia 2012. 
  4. Różnice między Clojure i Lisp . Pobrano 23 października 2017 r. Zarchiwizowane z oryginału 8 lipca 2019 r.

Literatura

Linki

Po rosyjsku