Język posiada następujące właściwości:

  • Funkcyjny
    • Nacisk na niezmienne struktury danych
    • Pragmatyczne wsparcie dla zmiennych struktur danych
    • Leniwe wartościowanie sekwencji
      • Z możliwością wymuszenia skutków ubocznych
  • Dynamicznie, silnie typowany
  • Kompilowany do bajtkodu JVM (JIT lub AOT). Sam rozprowadzany jako jar
  • Natywnie wspiera tworzenie obiektów Javy, wołanie ich metod; z Javy można wołać funkcje Clojura
  • Domknięcia (closures) z naciskiem na rekurencję zamiast pętli opartych o efekty uboczne
  • Wsparcie dla współbieżności
    • Transakcyjna pamięć (STM, mechanizm znany z systemów bazodanowych, taki ACID bez D)
    • System agentów (podobne do aktorów/procesów z Erlanga, tyle że bez rozproszenia)
  • Polimorfizm parametryczny (multimetody)
  • Makra (znane z Lispu)
  • Metadane (podobne do javowych anotacji czy atrybutów w C#, ale bardziej ogólne)
  • REPL (read-eval-print-loop, czyli tryb interaktywny)
  • Możliwość modyfikacji uruchomionego programu (hot patching)
  • Destrukturyzacja
  • Homoikoniczna składnia (code-as-data znane z Lispu)
  • Wyjątki (znane z Javy)
  • Przestrzenie nazw
  • Dynamic i lexical scoping

Definicje

Clojure zaprowadza porządek w elementarnych pojęciach: