Clojure

Clojure是Lisp编程语言在Java平台上的现代、动态及函数式方言。 与其他Lisp一样，Clojure视代码为数据且拥有一套Lisp宏系统。Clojure的开发过程目前由社区驱动，其作者里奇·希基则以终身仁慈独裁者的身份监督。
Clojure提倡不可变性与持久数据结构并鼓励程序员显式地管理标识及其状态。对利用不可变值及显式时间进展构造（explicit progression-of-time constructs）进行编程的专注旨在促进更加健壮的（尤其是并发）程序的开发。
对Clojure的商业支持由Cognitect公司提供。 每年都会在全球范围内举办年度Clojure会议，其中最著名的是Clojure/conj。
历史与开发过程.
里奇·希基创造了Clojure语言。在那之前，他还尝试了三次在Lisp与Java之间提供互操作：Common Lisp的Java外语接口、Lisp的外语对象接口以及Lisp友好的Java Servlet接口。
在公开发布之前，里奇·希基花了大约两年半的时间开发Clojure。他在没有外部资金的情况下，将其大部分时间都专门投入到了Clojure的工作上。开发快要完成，里奇·希基向Common Lisp社区里的一些朋友发布电子邮件，宣布他完成开发了Clojure。
Clojure的开发过程在Clojure JIRA项目网页由社区驱动并管理。该网站可用于提交问题报告。一般的开发讨论是在Clojure谷歌网上论坛上进行的。 任何人都可以提交错误报告和想法，而贡献补丁前则需要先签署Clojure贡献者协议。 JIRA错误报告由一组筛选者处理，最终由里奇·希基批准更改。
设计理念.
里奇·希基开发Clojure的原因是因为他想要一款适合函数式编程的现代Lisp。该语言既需要与已建立的Java平台共生又需要有适合并发性的设计。 Leiningen是社区中普遍使用的项目自动化工具。Leiningen为Maven集成提供支持，处理项目包管理和依赖项。Leiningen的配置使用的则是Clojure语法。
与其他大多数Lisp一样，Clojure的语法建立在S-表达式之上。S-表达式在被编译之前先由读取器解析为数据结构。 Clojure支持多方法（multimethods。） 对于类似接口的抽象，Clojure提供基于协议的多态性以及基于记录的数据类型系统。 Clojure通过这些设计来提供高性能且动态的多态性以避免所谓的“表达式问题”（"expression problem"。）
Clojure支持惰性序列，并鼓励不可变性与持久数据结构（persistent data structure。）Clojure作为一门函数式编程语言将重点放在递归与高阶函数上而不是基于副作用的循环流程上。Clojure不支持自动尾调用优化，因为JVM还不支持该项优化，但是，可以用codice_1关键字显式地执行该项优化。 对于并行与并发计算，Clojure提供软件事务内存、 响应式代理系统
Clojure 1.7引入了读取器条件表达式从而允许在同一名字空间中嵌入Clojure与ClojureScript代码。
平台.
Clojure的主要平台是Java（可被编译成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平台上的软件开发人员的青睐。该语言也一度成为知名软件开发老将的首选或推荐语言，如Brian Goetz、Eric Evans、詹姆斯·高斯林、保罗·格雷厄姆及Robert C. Martin（俗称“鲍勃大叔”）等人。
在由Snyk和Java Magazine合作编写的“JVM生态系统报告2018”（据称是“Java开发人员有史以来规模最大的调查”）中，Clojure被评为用于“主要应用程序”的第二大人气编程语言（仅次于Java）。
业内使用Clojure的公司有苹果公司、Atlassian、Funding Circle、Netflix、 Puppet 、沃尔玛及其他大型软件公司与美国国家航空航天局等政府机构。Clojure也一度被用于创意计算，包括视觉艺术、音乐、游戏和诗歌。
美国知名软件咨询公司ThoughtWorks在为其“技术雷达”评估函数式编程语言时表达了他们对Clojure的青睐，称其为“Lisp在JVM上的简单及优雅实现”，并在2012年将其状态提升为“采用”（“ADOPT”）。
越来越多的非官方和/或实验性的其他平台实现也验证了该语言的人气：
开发工具.
Clojure的开发工具在近几年得到了显著的改善。以下是目前最具人气的集成开发环境/编辑器及其Clojure插件。这些工具的结合为Clojure编程提供了出色的支持。
除了社区提供的开发工具之外，官方的命令行界面工具也随着Clojure 1.9一起发布并可在GNU/Linux、macOS及Windows上使用。
功能示例.
以下示例均可在Clojure REPL中运行（如，使用Clojure命令行界面工具上提供的在线REPL。）
简单性.
由于强调简单性，典型的Clojure程序主要包括函数和简单的数据结构（即列表，向量，映射和集合）：
<syntaxhighlight lang="clojure">
(defn -main ; 函数名
</syntaxhighlight>
REPL编程.
与其他Lisp一样，Clojure的标志性特征之一是基于REPL的交互式编程。在以下示例中，codice_2表示一行注释的开始，而codice_3则表示输出：
<syntaxhighlight lang="clojure">
clojure.core/rem
(defn rem
</syntaxhighlight>
运行时可用的名字.
与Clojure不同，其他语言的编译器会将程序中的名字编译掉使得它们在运行时不可用。而在Clojure中，可以用普通的数据结构对其运行时进行观察：
<syntaxhighlight lang="clojure">
</syntaxhighlight>
代码即数据（同像性）.
与其他Lisp类似，Clojure也具有同像性（又称代码即数据）。从下面的示例中可以看到，用Clojure编写代码从而修改代码本身是非常容易的：
<syntaxhighlight lang="clojure">
(map (fn 
</syntaxhighlight>
富有表现力的数据变换操作符.
穿梭宏（threading macro，如，codice_4、codice_5等）可以在语法上表达一个数据集在一系列变换间穿梭的抽象：
<syntaxhighlight lang="clojure">
</syntaxhighlight>
利用变换归纳器也可以更有效地实现该过程：
<syntaxhighlight lang="clojure">
</syntaxhighlight>
标识及其状态的线程安全管理.
线程安全的唯一序列号生成器（然而，和许多其他Lisp方言一样，Clojure内部使用其内置的codice_6函数）：
<syntaxhighlight lang="clojure">
(defn generate-unique-id
</syntaxhighlight>
宏.
codice_7的一个匿名子类（不写任何内容）和一个宏（使用该类来静音其中打印的所有内容）:
<syntaxhighlight lang="clojure">
(def bit-bucket-writer
(defmacro noprint
(noprint
</syntaxhighlight>
Java互操作.
作为其主要设计目标之一，Clojure从一开始就将其宿主平台视为其不可分割的一部分。Clojure与Java之间出色的互操作即得益于此：
<syntaxhighlight lang="clojure">
(javax.swing.JOptionPane/showMessageDialog
</syntaxhighlight>
软件事务内存.
10个线程操纵一个共享数据结构，该结构由100个向量组成，而每个向量包含10个（最初是连续的）唯一数字。每个线程随后在两个随机向量中重复选择两个随机位置并交换它们。通过使用Clojure的软件事务内存系统，对向量的所有更改都发生在事务中：
<syntaxhighlight lang="clojure">
(defn run
1 2 3 4 5 6 7 8 9
11 12 13 14 15 16 17 18 19
991 992 993 994 995 996 997 998 999
Distinct: 1000
318 466 963 619 22 21 273 45 596
639 804 471 394 904 952 75 289 778
216 622 139 651 592 379 228 242 355
Distinct: 1000
nil
</syntaxhighlight>