CLOJURE

Clojure ( shqiptimi: klouzhër )   është një dialekt dinamik dhe funksional i gjuhës së programimit Lisp në platformen Java.  

Ashtu si shumica e gjuhëve të tjera Lisp, sintaksa e Clojure është ndërtuar mbi shprehjet S që analizohen së pari në struktura të dhënash nga një lexues i Lisp-it  para se të perpilohen.   Lexuesi i Clojure mbështet sintaksën literale për hartat, bashkësitë dhe vektorët së bashku me listat, dhe këto perpilohen direkt në strukturat e përmendura.  Clojure e trajton kodin si të dhëna dhe ka një sistem makro Lisp.  Clojure është një Lisp-1 dhe nuk ka për qëllim të jetë i pajtueshëm me kodin me dialektet e tjera të Lisp, pasi përdor grupin e vet të strukturave të të dhënave të papajtueshme me Lisp-et e tjera. 

Clojure mbështet pandryshueshmërinë dhe strukturat e pandryshueshme te të dhënat dhe i inkurajon programuesit të jenë të qartë në lidhje me menaxhimin e identitetit dhe gjendjes së tij.  Ky fokus në programim me vlera të pandryshueshme dhe konstrukte të qarta të përparimit të kohës ka për qëllim të lehtësojë zhvillimin e programeve më të fuqishme, veçanërisht te njekohshme, që janë të thjeshta dhe të shpejta.    Ndërsa sistemi i tij i tipeve është tërësisht dinamik, përpjekjet e fundit kanë kërkuar gjithashtu zbatimin e një sistemi tipesh të varur. 

Gjuha u krijua nga Rich Hickey në mesin e viteve 2000, fillimisht për platformën Java; më vonë ajo u portua edhe në platforma të tjera, si Common Language Runtime (.NET). Hickey vazhdon të udhëheqë zhvillimin e gjuhës si drejtuesi i saj dashamirës për gjithë jetën.

 Historia 
parapamje|Rich Hickey, krijuesi i Clojure
Rich Hickey është krijuesi i gjuhës Clojure.  Përpara Clojure, ai zhvilloi dotLisp, një projekt të ngjashëm të bazuar në platformën .NET,  dhe tre përpjekje të mëparshme për të siguruar ndërveprim midis Lisp dhe Java: një ndërfaqe në gjuhë të huaj Java për Common Lisp ( jfli ),  një ndërfaqe objektesh të huaja për Lisp (FOIL),  dhe një ndërfaqe miqësore me Lisp për Servlet-et Java (Lisplets). 

Hickey kaloi rreth dy vjet e gjysmë duke punuar në Clojure para se ta publikonte atë publikisht në tetor te vitit 2007,  duke kaluar pjesën më të madhe të asaj kohe duke punuar vetem në Clojure pa fonde të jashtme. Në fund të kësaj kohe, Hickey u dërgoi një email disa miqve në komunitetin Common Lisp duke njoftuar gjuhën.

Emri i Clojure, sipas Hickey, është një loje fjalesh me konceptin e programimit " mbyllje " që përfshin shkronjat C, L dhe J për C#, Lisp dhe Java përkatësisht - tre gjuhë që patën një ndikim të madh në dizajnin e Clojure. 

 Dizajni 
Rich Hickey zhvilloi Clojure sepse donte një Lisp modern për programim funksional, simbiotik me platformën e vendosur Java dhe të projektuar për bashkëveprim.     Ai gjithashtu ka theksuar rëndësinë e thjeshtësisë në projektimin e gjuhës së programimit dhe arkitekturën e softuerit, duke mbështetur çiftëzimin e lirshëm, polimorfizmin nëpërmjet portokolleve të klasave të tipit në vend të trashëgimisë, funksionet pa gjendje që janë me hapsire emrash në vend të metodave ose duke zëvendësuar sintaksën e të dhënave.   

Qasja e Clojure ndaj gjendjes karakterizohet nga koncepti i identiteteve,  të cilat përfaqësohen si një seri gjendjesh të pandryshueshme me kalimin e kohës. Meqenëse gjendjet janë vlera të pandryshueshme, çdo numër punëtorësh mund të veprojnë mbi to paralelisht, dhe bashkëveprimi bëhet çështje e menaxhimit të ndryshimeve nga një gjendje në tjetrën. Për këtë qëllim, Clojure ofron disa lloje referencash të ndryshueshme, secila prej të cilave ka semantikë të përcaktuar mirë për kalimin midis gjendjeve.

Clojure funksionon në platformën Java dhe si rezultat, integrohet me Java dhe mbështet plotësisht thirrjen e kodit Java nga Clojure,   dhe kodi Clojure mund të thirret edhe nga Java.  Komuniteti përdor mjete të tilla si nderfaqja e linjes së komandes Clojure (CLI)  ose Leiningen për automatizimin e projektit, duke ofruar mbështetje për integrimin e Maven. Këto mjete merren me menaxhimin e paketave të projektit dhe varësitë dhe janë konfiguruar duke përdorur sintaksën Clojure.

Si një dialekt Lisp, Clojure mbështet funksione si objekte të klasit të parë, një lak lexim-vlerësim-printim (REPL) dhe një sistem makro.  Sistemi makro Lisp i Clojure është shumë i ngjashëm me atë të Common Lisp me përjashtim të faktit se versioni i Clojure i backquote (i quajtur "thonjë sintaksore") i kualifikon simbolet me hapësirën e tyre të emrave. Kjo ndihmon në parandalimin e kapjes së paqëllimshme të emrave, pasi lidhja me emra të kualifikuar të hapësirës së emrave është e ndaluar. Është e mundur të detyrohet një zgjerim i kapjes së makros, por duhet të bëhet në mënyrë të qartë. Clojure nuk lejon makro lexuesi të përcaktuara nga përdoruesi, por lexuesi mbështet një formë më të kufizuar të zgjerimit sintaksor.  Clojure mbështet multimetoda  dhe për abstraksione të ngjashme me nderfaqen ka një polimorfizëm të bazuar në protokoll  dhe një sistem të tipit të të dhënave duke përdorur regjistrime,  duke ofruar polimorfizëm me performancë të lartë dhe dinamikë të projektuar për të shmangur problemin e shprehjes.

Clojure mbështet sekuencat dembele dhe inkurajon parimin e pandryshueshmërisë dhe strukturat e të dhënave persistente. Si një gjuhë funksionale, theksi vihet në rekursion dhe funksionet e rendit më të lartë në vend të looping-ut të bazuar në efekte anësore. Optimizimi automatik i thirrjeve te bishtit nuk mbështetet pasi JVM nuk e mbështet atë në mënyrë native;    është e mundur ta bësh këtë në mënyrë eksplicite duke përdorur fjalën kyçe recur.  Për programim paralel dhe të njëkohshëm, Clojure ofron memorie transaksionale të softuerit,  një sistem agjentësh reaktivë,  dhe programim të njëkohshëm të bazuar në kanal. 

Clojure 1.7 prezantoi kushtet e lexuesit duke lejuar ngulitur kodin Clojure, ClojureScript dhe ClojureCLR në të njëjtën hapësirë emri.   Transduktorët u shtuan si një metodë për kompozimin e transformimeve. Transduktorët mundësojnë funksione të rendit më të lartë, të tilla si hartezimi dhe palosja, për të përgjithësuar mbi çdo burim të dhënash hyrëse. Ndërsa tradicionalisht këto funksione funksionojnë në sekuenca, transduktorët u lejojnë atyre të punojnë në kanale dhe i lejojnë përdoruesit të përcaktojë modelet e veta për transduksion.   

 Shënim i të dhënave të zgjerueshme 
Shënimi i të dhënave të zgjerueshme, ose edn, është një nëngrup i gjuhës Clojure i menduar si një format transferimi të dhënash. Mund të përdoret për të serializuar dhe deserializuar strukturat e të dhënave të Clojure, dhe vetë Clojure përdor një mbibashkësi të edn për të përfaqësuar programet.

edn përdoret në një mënyrë të ngjashme me JSON ose XML, por ka një listë relativisht të madhe të elementëve të integruar, të paraqitur këtu me shembuj:

 booleanët: true, false
 vargjet: "foo bar"
 karaktere: \c, \tab
 simbolet: name
 fjalë kyçe: :key
 numra të plotë: 123
 numra me pikë lundruese: 3.14
 listat: (ab 42)
 vektorët: [ab 42]
 hartat: {:a 1, "foo" :bar, [1 2 3] four}
 grupe: #{ab [1 2 3]}
 nil: nil (nje vlere e ngjashme m e nul )

Përveç këtyre elementëve, ai mbështet zgjerueshmërinë përmes përdorimit të etiketave, të cilat përbëhen nga karakteri # i ndjekur nga një simbol. Kur has një etiketë, lexuesi ia kalon vlerën e elementit tjetër trajtuesit përkatës, i cili kthen një vlerë të dhënash. Për shembull, ky mund të jetë një element i etiketuar: #myapp/Person {:first "Fred" :last "Mertz"}, interpretimi i të cilit do të varet nga trajtuesi i duhur i lexuesit.

Ky përkufizim i elementëve të zgjerimit në terma të të tjerëve shmang mbështetjen në konventë ose kontekst për të përcjellë elementë që nuk përfshihen në grupin bazë.

 Platformat alternative 
Platforma kryesore e Clojure është Java,  por ekzistojnë edhe implementime të tjera të synuara. Më i dallueshmi prej tyre është ClojureScript, i cili kompilohet në ECMAScript 3, dhe ClojureCLR, një port i plotë në platformën .NET , i ndërveprueshëm me ekosistemin e tij.

Implementime të tjera të Clojure në platforma të ndryshme përfshijnë:

 Babashka,  një gjuhë skriptimi vendase Clojure që përdor imazhin vendas GraalVM dhe interpretuesin e vogël Clojure
 ClojureDart,  zgjeron përdorimin e Clojure në aplikacionet mobile dhe desktop duke e transferuar Clojure në Dart dhe Flutter
 Clojure,  Clojure në BEAM, makina virtuale Erlang
 basilisp,  një dialekt Lisp i pajtueshëm me Clojure (i përafërt) që synon Python 3.8+
 ClojureRS,  Clojure mbi Rust
 Ferret,  kompilohet në C++11 të pavarur që mund të funksionojë në mikrokontrollues.
 jank,  Clojure native i hostuar në C++ në një JIT të bazuar në LLVM
 Joker,  një interpretues dhe linter i shkruar në Go

 Mjetet 
Mjetet për zhvillimin e Clojure kanë parë përmirësime të konsiderueshme gjatë viteve. Më poshtë është një listë e disa IDE-ve dhe redaktuesve tekstit të njohur me shtesa që shtojnë mbështetje për programimin në Clojure:

 Emacs, me CIDER 
 IntelliJ IDEA, me Cursive  (një licencë falas për përdorim jo-komercial )
 Sublime Text, me Clojure Sublimed,  ose Tutkain, 
 Vim, me fireplace.vim,   vim-elin,  ose Conjure (vetëm per Neovim)  
 Kodi i Visual Studio, me Calva 
 IDE-agnostik: clojure-lsp  si një Server Gjuhesor; clj-kondo  si një linter (përdoret edhe nga clojure-lsp)

Përveç mjeteve të ofruara nga komuniteti, mjetet zyrtare të ndërfaqes së linjës së komandës (CLI) të Clojure janë bërë gjithashtu të disponueshme në Linux, macOS dhe Windows që nga Clojure 1.9.

 Zhvillimi 
Procesi i zhvillimit është i kufizuar në ekipin kryesor të Clojure, megjithëse problemet janë të dukshme publikisht në faqen e projektit Clojure JIRA.  Kushdo mund të bëjë pyetje ose të paraqesë probleme dhe ide në ask.clojure.org.  Nëse përcaktohet se një problem i ri meriton një biletë JIRA, një anëtar i ekipit kryesor do ta analizojë atë dhe do ta shtojë atë. Çështjet e JIRA-s përpunohen nga një ekip verifikuesish dhe miratohen përfundimisht nga Rich Hickey.  

 Ndikimi 
Me interes të vazhdueshëm për programimin funksional, përvetësimi i Clojure nga zhvilluesit e softuerëve që përdorin platformën Java ka vazhduar të rritet. Gjuha është rekomanduar gjithashtu nga zhvillues softuerësh si Brian Goetz,   Eric Evans,  James Gosling,  Paul Graham,  dhe Robert C. Martin.     ThoughtWorks, ndërsa vlerësonte gjuhët e programimit funksional për Technology Radar-in e tyre,  e përshkroi Clojure si "një implementim të thjeshtë dhe elegant të Lisp në JVM" në vitin 2010 dhe e promovoi statusin e saj në "ADOPT" në vitin 2012. 

Në "JVM Ecosystem Report 2018" (i cili u pretendua të ishte "anketa më e madhe ndonjëherë e zhvilluesve të Java"), që u përgatit në bashkëpunim nga Snyk dhe Java Magazine, Clojure renditi si gjuha e dytë e programimit më e përdorur në JVM për "aplikacionet kryesore".  Clojure përdoret në industri nga firma  të tilla si Apple,   Atlassian,  Funding Circle,  Netflix,  Nubank,  Puppet,  dhe Walmart , si dhe nga agjenci qeveritare si NASA.  Është përdorur gjithashtu për informatikë krijuese, duke përfshirë artin vizual, muzikën, lojërat dhe poezinë. 

Në edicionin e vitit 2023 të Stack Overflow Developer Survey, Clojure ishte e katërta më e admiruar në kategorinë e gjuhëve të programimit dhe skriptimit, me 68.51% të të anketuarve që kanë punuar me të vitin e kaluar që thanë se do të donin të vazhdonin ta përdornin. Megjithatë, në kategorinë e dëshiruar u shënua si e tillë vetëm nga 2.2% e të anketuarve, ndërsa JavaScript me rezultatin më të lartë dëshirohej nga 40.15% e zhvilluesve që morën pjesë në anketë.

 Referime