Clojure

**Clojure** on dünaamilise tüübisüsteemiga funktsionaalne Lispi programmeerimiskeele dialekt, mis töötab Java platvormil. Sarnaselt teiste Lispi dialektidega järgib Clojure *code-as-data* filosoofiat ning kasutab makrosid. Arendusprotsess on kogukonna suunatav ning seda haldab Clojure'i looja Rich Hickey.

Clojure soodustab muutumatute väärtuste ja andmestruktuuride kasutamist ning identiteedi ja oleku ilmutatud kujul haldamist. Muutumatute väärtuste kasutamine ning konstruktsioonid, mis toovad väärtuste muutumise ajas ilmutatud kujul nähtavale, on mõeldud toetama töökindla, lihtsa ja kiire tarkvara, eriti mitmelõimelise tarkvara, arendamist. Kuigi Clojure'i tüübisüsteem on täielikult dünaamiline, on hiljuti tehtud jõupingutusi, et lisada sõltuv tüübisüsteem.

## Ajalugu ja arendusprotsess
Clojure'i väljatöötaja on Rich Hickey. Enne Clojure'i loomist arendas ta dotLispi, mis oli Clojure'iga sarnane programmeerimiskeel, mis tugines .NET platvormile, ning kolme varasemat katset ühildada Lispi Java platvormiga. Hickey arendas Clojure'i umbes kaks ja pool aastat enne selle esmast avalikku väljalaset 2007. aasta oktoobris.

Arendusprotsess on kogukonna suunatav ning seda hallatakse Clojure'i JIRA lehel. Üldine arendusega seonduv arutelu toimub Clojure'i Google Groupi lehel ning igaüks saab esitada parandusettepanekuid ja uusi ideid lehel ask.clojure.org. JIRA pileteid haldab analüütikute meeskond ning kõik muudatused kiidab heaks Rich Hickey.

Nimi Clojure on Hickey sõnul sõnamäng programmeerimisterminiga *closure* (sulund inglise keeles) ning tähtedega C, L ja J, mis tähistavad vastavalt C#-i, Lispi ning Javat – kolme keelt, mis mõjutasid suurel määral Clojure'i disaini.

## Disaini filosoofia
Rich Hickey lõi Clojure'i, kuna ta tahtis tänapäevast Lispi, mis toetaks funktsionaalset programmeerimist, eksisteeriks sümbioosis olemasoleva Java ökosüsteemiga ja hõlbustaks konkurentset programmeerimist.

Programmi oleku haldamiseks kasutab Clojure identiteete, mis on olemid mis on seotud muutumatute olekute jadaga, kus millegi muutmiseks asendatakse vana olek uuega. Kuna olekud on muutumatud väärtused, saab suvaline arv erinevaid funktsioone samaaegselt sama väärtusega opereerida ning konkurrentsuse haldamine taandub ühest olekust teise üleminekute haldamisele. Selleks toetab Clojure mitmeid viittüüpe, millel on kõigil selgelt määratletud olekutevaheliste üleminekute semantika.

## Ülevaade
Clojure jookseb Java platvormil ning selle tulemusena liidestub Javaga ja toetab Java koodi väljakutsumist Clojure'ist ja Clojure'i koodi väljakutsumist Javast. Projektihalduseks kasutatakse tööriista Leinigen, mis haldab projektide pakendamist ning vajaminevaid teeke. Seda seadistatakse Clojure'i süntaksiga.

Sarnaselt teistele Lisp perekonna programmeerimiskeeltele koosneb Clojure'i süntaks sulgudega piiritletud järjenditest, mis teisendatakse enne kompileerimist lugeja poolt andmestruktuurideks, sealhulgas järjenditeks, massiivideks, sõnastikeks ja hulkadeks. Clojure on Lisp-1 ning ei ole mõeldud süntaktiliselt ühilduma teiste Lispi dialektidega, kuna see kasutab andmestruktuure, mis ei ole ühildatavad teiste Lispi dialektidega.

Clojure toetab funktsioonide käsitlemist väärtustena, interaktiivset REPL keskkonda ja makrosid. Clojure'i makrode süsteem on sarnane Common Lispi makrode süsteemiga. Clojure ei toeta kasutaja loodud lugejamakrosid, kuid toetab rangemalt piiratud lähenemisi keele süntaksi laiendamiseks. Clojure toetab mitmikmeetodeid, liideste määratlemiseks on kasutusel protokollid (ingl *protocols*) ning andmetüüpide määratlemiseks kirjed (ingl *records*).

Clojure toetab laisalt väärtustatud järjendeid ning soodustab muutmatute väärtuste ja andmestruktuuride kasutamist. Kuna Clojure on funktsionaalne programmeerimiskeel eelistatakse kõrvaltoimetega tsüklite asemel rekursiooni ning kõrgemat järku funktsioone. Automaatne sabarekursiooni optimeerimine pole toetatud, kuna Java virtuaalmasinad ei toeta seda. Sabarekursiooni optimeerimise saab aktiveerida kasutades `recur` võtmesõna.

Andmestruktuuridele rakendatavate teisenduste kombineerimiseks toetab keel muundureid (ingl *transducers*). Muundurid võimaldavad kõrgemat järku funktsioone, nagu näiteks `map` ja `fold`, üldistada nii, et need toimivad suvalist tüüpi andmestruktuuridel.

## edn

**edn** (ingliskeelne lühend sõnadest *Extensible Data Notation* – laiendatav andmenotatsioon) on Clojure'i süntaksi alamhulk, mis on mõeldud kasutamiseks andmevahetusvorminguna. Seda saab kasutada Clojure'i andmestruktuuride serialiseerimiseks ja deserialiseerimiseks ning Clojure kasutab ülemhulka edn-ist programmide lähtekoodi esitamiseks. edn-i kasutus sarnaneb JSON-i või XML-i kasutusele.

Lisaks sisseehitatud andmestruktuure ja lihttüüpe tähistavatele elementidele toetab edn kasutajate loodud laiendusi kasutades silte (ingl *tags*), mis koosnevad sümbolist `#`, millele järgneb sildi tähis. Silti kohates annab lugeja järgneva elemendi varem registreeritud funktsioonile, mis sisaldab sildile vastavat loogikat andmete deserialiseerimiseks ja tagastab vastava deserialiseeritud väärtuse.

## Alternatiivsed platvormid
Clojure'i põhiliseks platvormiks on Java virtuaalmasin, kuid Clojure'il on teostusi ka teistel platvormidel. Kõige tähelepanuväärsem neist on ClojureScript, mis kompileerub ECMAScriptiks ja ClojureCLR, mis realiseerib Clojure'i .NET platvormil ning ühildub .NET platvormi ökosüsteemiga.

Clojure'i kogukonnas 2013. aastal läbi viidud 1060 vastajaga küsitlus leidis, et 47% vastanutest kasutab nii Clojure'i kui ka ClojureScripti. 2014 aastaks oli see arv tõusnud 55%-ni ning 2015. aastaks 66%-ni. Populaarsete ClojureScripti projektide hulka kuuluvad Reacti teegi teostused, näiteks Reagent, re-frame, Rum, ja Om.

## Populaarsus
Tänu püsivale huvile funktsionaalse programmeerimise vastu on Clojure'i kasutajaskond Java platvormi kasutavate tarkvaraarendajate hulgas kasvanud. Programmeerimiskeelt on soovitanud muu hulgas tarkvaraarendajad Brian Goetz, Eric Evans, James Gosling, Paul Graham, ja Robert C. Martin.

Küsitlus "JVM Ecosystem Report 2018", mis väidab end olevat suurim Java arendajate küsitlus maailmas, leidis, et Clojure on teine kõige kasutatum Java virtuaalmasinal jooksev keel kesksete rakenduste arendamiseks. Clojure'i kasutavad mitmed suurfirmad, sealhulgas Apple, Atlassian, Funding Circle, Netflix, Nubank, Puppets ja Walmart, ning samuti riiklikud asutused, sealhulgas NASA. Samuti on seda kasutatud loominguliseks programmeerimiseks, sealhulgas visuaalse kunsti, muusika, mängude ja luule loomiseks.

## Viited