Can you summarize the following document?
        
  裡奇·希基(Rich Hickey)是Clojure語言的創造者。 在Clojure之前,他開發過類似但基於.NET平臺的專案——dotLisp。 在那之前,他還有過三次旨在在Lisp與Java之間提供互操作(interoperability)的嘗試:“Common Lisp的Java外語介面”[Java foreign language interface for Common Lisp (jfli)]、“Lisp的外語物件介面”[Foreign Object Interface for Lisp (FOIL)]以及“Lisp友好的Java Servlet介面”[Lisp-friendly interface to Java Servlets (Lisplets)]。  在公開發布之前,裡奇·希基在Clojure的工作上花了大約兩年半的時間。期間,在沒有外部資金的情況下,他將其大部分時間都專門投入到了Clojure的工作上。在這段時間結束時,裡奇·希基以電子郵件的形式向他在Common Lisp社群裡的一些朋友宣佈了該語言。  Clojure的開發過程由社群驅動並且在Clojure JIRA專案網頁上進行管理。 該網站可用於提交問題報告(issue)。一般的開發討論是在“Clojure谷歌網上論壇”(Clojure Google Group)上進行的。 任何人都可以提交錯誤報告和想法,而貢獻補丁(patches)則需要先簽署“Clojure貢獻者協議”(Clojure Contributor Agreement)。 JIRA錯誤報告(JIRA ticket)由一個篩選者(screener)團隊進行處理並最終由裡奇·希基批准更改。

  裡奇·希基開發Clojure的原因是因為他想要一款適合函數語言程式設計的現代Lisp。該語言既需要與已建立的Java平臺共生又需要有適合併發性的設計。  Clojure對待變化(change)的方式以標識(identity)的概念為特徵。 標識是指隨著時間的推移而產生的一系列狀態(state)。而狀態則是指標識在某一特定時間點上的值(value)。需要強調的是,這裡的值是不可變的(immutable)。由此引申,由於狀態是不可變的值,任意數量的工作單位(workers)都可以在其上以並行(parallel)的方式實施操作。因此,併發性(concurrency)就成為一道管理狀態間變化的問題[注意,這裡的“變化”是指從一個狀態到另外一個狀態的躍遷(transition)而不是狀態本身的變化(mutation)。]為此,Clojure提供了幾個可變的(mutable)引用型別(reference type)。每個引用型別都有其明確定義的語義用於控制狀態之間的躍遷。

  Clojure執行於Java平臺之上,因此,與Java緊密整合並完全支援從Clojure呼叫Java程式碼。<ref name="about/jvm_hosted"></ref> 與此同時,也可以從Java呼叫Clojure程式碼。 Leiningen是社群中普遍使用的專案自動化工具。Leiningen為Maven整合提供支援,處理專案包管理和依賴項。Leiningen的配置使用的則是Clojure語法。  與其他大多數Lisp一樣,Clojure的語法建立在S-表示式之上。S-表示式在被編譯之前先由讀取器(reader)解析為資料結構。<ref name="reference/reader"></ref> 除了列表(list)之外,Clojure的讀取器還支援對映(map)、集合(set)及向量(vector)等的字面量(literal)語法。這些字面量隨後會被直接編譯成上述資料結構。 Clojure是Lisp-1且有一套與其它Lisp不相容的資料結構,因此,Clojure不支援與Lisp的其它方言之間的程式碼級相容性。  作為一門Lisp方言,函式在Clojure中是一等公民。此外,Clojure還支援讀取-求值-輸出迴圈(REPL)以及一套巨集系統。 Clojure的Lisp巨集系統與Common Lisp的系統極為相似。唯一不同的是,Clojure的重音符[稱為“語法引用”(syntax quote)]用名字空間(namespace)來限定符號(symbol)。這有助於防止意外的名字捕獲(unintended name capture),因為Clojure禁止繫結(binding)到用名字空間限定的名字(namespace-qualified name)上。如果需要強制捕獲巨集擴充套件(capturing macro expansion,)那麼就需要顯示地完成該過程。Clojure不支援使用者定義的讀取器巨集(reader macro,)但Clojure的讀取器支援更具約束力的語法擴充套件(syntactic expansion)形式。 Clojure支援多重方法(multimethods。) 對於類似介面的抽象,Clojure提供基於協議(protocol)的多型性(polymorphism)以及基於記錄(record)的資料型別系統。 Clojure通過這些設計來提供高效能且動態的多型性以避免所謂的“表示式問題”("expression problem"。)  Clojure支援惰性序列,並鼓勵不可變性(immutability)與持久資料結構(persistent data structure。)Clojure作為一門函數語言程式設計語言將重點放在遞迴與高階函式上而不是基於副作用的迴圈流程上。Clojure不支援自動尾呼叫優化,因為JVM還不支援該項優化,但是,可以用codice_1關鍵字顯式地進行該項優化。 對於並行與併發計算,Clojure提供軟體事務記憶體、 響應式代理系統及基於通道(channel)的併發程式設計。  Clojure 1.7引入了讀取器條件表示式(reader conditional)從而允許在同一名字空間中嵌入Clojure與ClojureScript程式碼。 變換歸納器(transducer)的加入則提供了另一種組合變換的方法。變換歸納器可以使高階函式(如,codice_2和codice_3)更加抽象從而使之獨立於其輸入資料來源。傳統地說,這些函式一般被應用於序列(sequence)上,而變換歸納器允許這些函式被應用於通道(channel)上並讓使用者定義她們自己的變換歸納(transduction)模型。

  Clojure的主要平臺是Java但也存在其他目標平臺上的實現。其中,最值得關注的是ClojureScript(可被編譯成ECMAScript 3)和ClojureCLR(.NET平臺上的完整移植版,可與其生態系統互操作。)2013年對1,060名受訪者進行的Clojure社群調查發現,47%的受訪者在使用Clojure的同時也使用ClojureScript。2014年,這一數字增長到了55%,而到了2015年,則達到了66%(根據2,445名受訪者)。 人氣較高的ClojureScript專案包括React實現,如Reagent、re-frame、Rum及Om。

  隨著對函數語言程式設計的興趣的持續升溫,Clojure也越來越多地受到Java平臺上的軟體開發人員的青睞。該語言也一度成為知名軟體開發老將(如Eric Evans 、詹姆斯·高斯林、保羅·格雷厄姆及Robert C. Martin(俗稱“Uncle Bob”)等)的首選或推薦語言。  在由Snyk和Java Magazine合作編寫的“JVM生態系統報告2018”(據稱是“Java開發人員有史以來規模最大的調查”)中,Clojure被評為用於“主要應用程式”的第二大人氣程式語言(僅次於Java)。  業內使用Clojure的公司有蘋果公司、Atlassian、Funding Circle、Netflix、 Puppet、沃爾瑪及其他大型軟體公司與美國國家航空航天局等政府機構。Clojure也一度被用於創意計算,包括視覺藝術、音樂、遊戲和詩歌。  美國知名軟體諮詢公司ThoughtWorks在為其“技術雷達”評估函數語言程式設計語言時表達了他們對Clojure的青睞,稱其為“Lisp在JVM上的簡單及優雅實現”,並在2012年將其狀態提升為“採用”(“ADOPT”)。  越來越多的非官方和/或實驗性的其他平臺實現也驗證了該語言的人氣:

  Clojure的開發工具在近幾年得到了顯著的改善。以下是目前最具人氣的整合開發環境(IDE)/編輯器及其Clojure外掛。這些工具的結合為Clojure程式設計提供了出色的支援。 除了社群提供的開發工具之外,官方的命令列介面(CLI)工具<ref name="guides/deps_and_cli"></ref>也隨著Clojure 1.9一起釋出並可在GNU/Linux、macOS及Windows上使用。

  以下示例均可在Clojure REPL中執行(如,使用Clojure命令列介面工具啟動的REPL或在REPL.it上提供的線上REPL。)

  由於強調簡單性,典型的Clojure程式主要包括函式和簡單的資料結構(即列表,向量,對映和集合):

  與其他Lisp一樣,Clojure的標誌性特徵之一是基於REPL的互動式程式設計。在以下示例中,codice_4表示一行註釋的開始,而codice_5則表示輸出:

  與Clojure不同,其他語言的編譯器會將程式中的名字編譯掉使得它們在執行時不可用。而在Clojure中,可以用普通的資料結構對其執行時進行觀察:

  與其他Lisp類似,Clojure也具有同像性[又被稱為“程式碼即資料”(code as data)]。從下面的示例中可以看到,用Clojure編寫程式碼從而修改程式碼本身是非常容易的:

  穿梭巨集(threading macro,如,codice_6、codice_7等)可以在語法上表達一個資料集在一系列變換間穿梭的抽象:  利用變換歸納器(transducer)也可以更有效地實現該過程:

  執行緒安全的唯一序列號生成器(然而,和許多其他Lisp方言一樣,Clojure內部使用其內建的codice_8函式):

  codice_9的一個匿名子類(不寫任何內容)和一個巨集(使用該類來靜音其中列印的所有內容):

  作為其主要設計目標之一,Clojure從一開始就將其宿主平臺(host platforms)視為其不可分割的一部分。Clojure與Java之間出色的互操作即得益於此:

  10個執行緒操縱一個共享資料結構,該結構由100個向量組成,而每個向量包含10個(最初是連續的)唯一數字。每個執行緒隨後在兩個隨機向量中重複選擇兩個隨機位置並交換它們。通過使用Clojure的軟體事務記憶體系統,對向量的所有更改都發生在事務中:
Clojure()<ref name="interview/a-z">是Lisp程式語言在Java平臺上的現代、動態及函式式方言。<ref name="platform/android"> 與其他Lisp一樣,Clojure視程式碼為資料且擁有一套Lisp巨集系統。<ref name="reference/lisps"> 其開發過程目前由社群驅動,<ref name="dev/dev"> 其作者裡奇·希基(Rich Hickey)則以終身仁慈獨裁者(BDFL)的身份進行監督。