Clojure

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania
Clojure
Logo języka
Pojawienie się 16 października 2007[1]
Paradygmat funkcyjny, wieloparadygmatowy
Typowanie dynamiczne, silne
Aktualna wersja stabilna 1.5.1[2] (10 marca 2013)
Twórca Rich Hickey
Licencja Eclipse Public License
Platforma sprzętowa wieloplatformowy
Platforma systemowa wieloplatformowy
Oficjalna strona Clojure

Clojure (/'klo'uʒə/ i[3]) – nowoczesny dialekt języka programowania Lisp opracowany przez Richa Hickeya. Jest to język ogólnego przeznaczenia, wspierający modyfikację uruchomionego programu i zachęcający do programowania funkcyjnego oraz współbieżnego.

Clojure akcentuje niezmienność struktur danych jako kluczową technikę ułatwiającą programowanie współbieżne. Działa na wirtualnej maszynie Javy. Może być uruchamiany przez interpreter lub kompilowany do kodu bajtowego. Można w nim tworzyć aplety, aplikacje, lub Serwlety, co umożliwia tworzenie aplikacji internetowych w całości w języku Clojure. Cały język mieści się w jednym pliku jar. Ma rozbudowany system makr znany z Lispu, dzięki czemu można rozszerzać język o nowe konstrukcje. Posiada jedną przestrzeń nazw dla funkcji i zmiennych tak jak Scheme. Posiada pełną integrację z językiem Java, można uruchamiać kod Clojure z poziomu Javy jak i kod Javy z poziomu Clojure.

Etymologia nazwy[edytuj | edytuj kod]

Rich Hickey – twórca języka Clojure

Nazwa Clojure pochodzi od słowa Closure (domknięcie), które jest ważnym elementem języka Lisp, z literą s zamienioną na j, wskazująca Javę. Autor chciał utworzyć nazwę, która nawiązywałaby do C#, Lispa i Javy[3] i to właśnie dlatego wybrał to słowo na nazwę swojego języka programowania.

Niektóre cechy języka[edytuj | edytuj kod]

  • Kompilowany do kodu bajtowego JVM (ang. Java Virtual Machine, wirtualna maszyna Javy);
  • Pełna kompatybilność z Javą: Clojure natywnie wywołuje metody Javy i na odwrót;
  • Możliwość pracy w trybie interaktywnym REPL (ang. read–eval–print loop, pętla wczytaj–wykonaj–wypisz);
  • Domknięcia z naciskiem na rekurencję;
  • Bogata biblioteka stałych struktur danych;
  • Silne wsparcie dla współbieżności w postaci transakcyjnej pamięci (ang. Software Transactional Memory – STM) i systemu

agentów.

Przykłady[edytuj | edytuj kod]

Uruchomienie REPL[edytuj | edytuj kod]

java -cp clojure.jar clojure.main

Wypisywanie tekstu[edytuj | edytuj kod]

(println "Hello world!")

Definicja symbolu[edytuj | edytuj kod]

Symbol jest nazwą przypisywaną do obliczenia - jego wyniku lub funkcji. Symbol może przypominać zmienną, ale jest tylko i wyłącznie stałą, którą można przesłonić. W Clojure nie istnieje operator przypisania "=".

(def wynik (+ 2 (* 4 5)))

Definicja funkcji[edytuj | edytuj kod]

Funkcja obliczająca silnie (nazwy zmiennych tj. symboli, tak jak w innych dialektach języka lisp mogą się składać z dowolnych znaków).

(defn ! [x]
  (if (= x 0)
      1
      (* x (! (- x 1)))))

Funkcje anonimowe[edytuj | edytuj kod]

(fn [x] (* 2 (/ 3 4)))

Funkcje wyższego rzędu[edytuj | edytuj kod]

(defn f [x]
   (* 2 (/ 3 4)))
(map f '(3 4 5 6 7 8))
 
;; Lub to samo używając funkcji anonimowej:
(map (fn [x] (* 2 (/ 3 4))) '(3 4 5 6 7 8))

Makra[edytuj | edytuj kod]

Makro define służące do definiowania funkcji jak w Scheme. W odróżnieniu od innych dialektów, do obliczenia wyrażenia wewnątrz cytowania Quasi-quotation, zamiast przecinka używa się znaku tyldy.

(defmacro define [params & body]
  `(defn ~(first params) [~@(rest params)] ~@body))
 
(define (f x) (* x x))
(f 10)

Tworzenie nowego obiektu Javy[edytuj | edytuj kod]

(new java.lang.String "Hello world!")

Wywoływanie metody obiektu[edytuj | edytuj kod]

(defn upper [s] (.toUpperCase s))
(upper (new java.lang.String "foo bar"))

Wywoływanie metody statycznej[edytuj | edytuj kod]

Funkcja string → integer występująca w języku Scheme.

(defn string→integer
  ([str]
     (Integer/parseInt str 10))
  ([str base]
     (Integer/parseInt str base)))

GUI[edytuj | edytuj kod]

Użycie biblioteki Swing.

(javax.swing.JOptionPane/showMessageDialog nil "Hello world!")

Zobacz też[edytuj | edytuj kod]

Linki zewnętrzne[edytuj | edytuj kod]

Wikibooks-logo.svg
Zobacz publikację na Wikibooks:
Clojure Programming

Bibliografia[edytuj | edytuj kod]

  • Rationale. W: Rich Hickey [on-line]. clojure.org. [dostęp 2011-07-18].

Przypisy

  1. Rich Hickey: Pierwszy rok Clojure'a (ang.). 16 października 2008. [dostęp 2011-07-18].
  2. Clojure 1.5.1 - Google Groups. groups.google.com, 2013-03-10. [dostęp 2013-06-30].
  3. 3,0 3,1 Rich Hickey: Znaczenie i wymowa Clojure (ang.). 5 stycznia 2009. [dostęp 2011-07-18].