Clojure(/ ˈkloʊʒər /、 closureと同じ発音)[ 17 ] [ 18 ]は、 Javaプラットフォーム上のLispプログラミング言語の動的かつ関数型の方言である。[ 19 ] [ 20 ]
他のほとんどの Lisp と同様に、Clojure の構文はS 式に基づいて構築されており、コンパイルされる前にLisp リーダーによってデータ構造に解析されます。[ 21 ] [ 17 ] Clojure のリーダーは、リストに加えてマップ、セット、ベクトルのリテラル構文をサポートしており、これらは前述の構造に直接コンパイルされます。[ 21 ] Clojure はコードをデータとして扱い、Lisp マクロシステムを備えています。[ 22 ] Clojure はLisp-1であり、他の Lisp と互換性のない独自のデータ構造セットを使用しているため、他の Lisp の方言とのコード互換性を意図していません。[ 22 ]
Clojure は不変性と不変データ構造を提唱し、プログラマーにアイデンティティとその状態の管理を明示的に行うよう促しています。[ 23 ]不変値と明示的な時間進行構造を用いたプログラミングに重点を置くことで、より堅牢で、特に並行処理に対応した、シンプルで高速なプログラムの開発を容易にすることを目指しています。[ 24 ] [ 25 ] [ 17 ]その型システムは完全に動的ですが、最近の取り組みでは依存型システムの実装も試みられています。[ 26 ]
この言語は、2000年代半ばにリッチ・ヒッキーによって、当初はJavaプラットフォーム向けに開発されました。その後、.NET( Common Language Runtime )などの他のプラットフォームにも移植されています。ヒッキーは、終身の慈悲深い独裁者として、現在もこの言語の開発を主導しています。

Rich Hickeyは Clojure 言語の作者です。[ 19 ] Clojure 以前には、.NETdotLispプラットフォームに基づく同様のプロジェクトである を開発し、[ 27 ] Lisp とJavaの相互運用性を提供するための 3 つの初期の試み、すなわちCommon Lisp用の Java 外部言語インターフェース( )、[ 28 ] Lisp 用の外部オブジェクトインターフェース(FOIL)、[ 29 ]およびJava サーブレットへの Lisp フレンドリーなインターフェース(Lisplets) [ 30 ]を開発しました。jfli
ヒッキーは2005年にClojureの開発に着手し[ 31 ] [ 32 ]、2007年10月にClojureを一般公開するまで約2年半を費やした[ 33 ]。その間、外部からの資金援助を受けずにClojureの開発に専念した。彼の妻であるステファニー・ヒッキーは、コードを書かずに積極的に耳を傾け、議論に参加することで言語の設計に貢献した[ 32 ]。この期間の終わりに、ヒッキーはCommon Lispコミュニティの友人たちに言語の発表をメールで送った。
Hickeyによれば、Clojureという名前はプログラミングの概念「クロージャ」をもじったもので、C#、Lisp、Javaの文字C、L、Jを組み合わせたもので、Clojureの設計に大きな影響を与えた3つの言語である。[ 18 ]
Rich Hickey は、確立されたJavaプラットフォームと共生し、並行処理用に設計された、関数型プログラミング用のモダンなLisp を求めて Clojure を開発しました。[ 24 ] [ 25 ] [ 34 ] [ 17 ] [ 32 ]また、プログラミング言語設計とソフトウェア アーキテクチャにおけるシンプルさの重要性を強調し、疎結合、継承ではなくプロトコルと型クラスによる多態性、メソッドではなく名前空間を持つステートレス関数、または構文をデータに置き換えることを提唱しています。[ 35 ] [ 36 ] [ 31 ]
Clojure の状態へのアプローチは、時間の経過に伴う一連の不変の状態として表現されるアイデンティティの概念によって特徴付けられます。 [ 23 ]状態は不変の値であるため、任意の数のワーカーが並行して操作でき、並行処理は、ある状態から別の状態への変更を管理する問題となります。この目的のために、Clojure はいくつかの可変参照型を提供しており、それぞれが状態間の遷移のための明確な意味論を持っています。[ 23 ]
Clojure は Java プラットフォーム上で動作するため、Java と統合され、Clojure から Java コードの呼び出しを完全にサポートしています[ 37 ] [ 17 ]。また、Java から Clojure コードを呼び出すこともできます[ 38 ] 。コミュニティは、プロジェクトの自動化のために Clojureコマンドライン インターフェイス(CLI) [ 39 ]やLeiningenなどのツールを使用し、 Maven との統合をサポートしています。これらのツールは、プロジェクトのパッケージ管理と依存関係を処理し、Clojure 構文を使用して構成されます。
Lisp の方言である Clojure は、関数を第一級オブジェクトとしてサポートし、読み取り・評価・印刷ループ(REPL) とマクロシステムをサポートしています。[ 6 ] Clojure のLisp マクロシステムはCommon Lispのマクロシステムと非常によく似ていますが、Clojure のバッククォート(「構文クォート」と呼ばれる) はシンボルを名前空間で修飾するという点が異なります。これにより、名前空間で修飾された名前へのバインディングが禁止されているため、意図しない名前のキャプチャを防ぐことができます。キャプチャマクロの展開を強制することは可能ですが、明示的に行う必要があります。Clojure はユーザー定義のリーダー マクロを許可していませんが、リーダーはより制約された形式の構文拡張をサポートしています。[ 40 ] Clojure はマルチメソッド[ 41 ]をサポートし、インターフェースのような抽象化には、プロトコル[ 42 ]に基づく多態性とレコードを使用したデータ型システム[ 43 ]があり、式の問題を回避するように設計された高性能で動的な多態性を提供します。
Clojure は遅延シーケンスをサポートし、不変性と永続的なデータ構造の原則を推奨しています。関数型言語として、副作用に基づくループではなく、再帰と高階関数に重点が置かれています。JVMがネイティブにサポートしていないため、自動末尾呼び出し最適化はサポートされていません。 [ 44 ] [ 45 ] [ 46 ]キーワードを使用することで明示的に実行できますrecur。[ 47 ]並列および並行プログラミングのために、Clojure はソフトウェア トランザクショナル メモリ、[ 48 ]リアクティブエージェント システム、[ 1 ]およびチャネル ベースの並行プログラミングを提供します。[ 49 ]
Clojure 1.7 では、Clojure、ClojureScript、ClojureCLR コードを同じ名前空間に埋め込むことができるようにすることで、リーダー条件が導入されました。[ 50 ] [ 21 ]トランスデューサは、変換を構成する方法として追加されました。トランスデューサを使用すると、 mapやfoldなどの高階関数が、あらゆる入力データソースに対して一般化できるようになります。従来、これらの関数はシーケンスに対して動作していましたが、トランスデューサを使用すると、チャネルに対して動作させることができ、ユーザーが変換のための独自のモデルを定義できるようになります。[ 51 ] [ 52 ] [ 53 ]
拡張可能なデータ表記法、またはedn [ 54 ]は、データ転送フォーマットとして意図されたClojure言語のサブセットです。Clojureデータ構造のシリアライズとデシリアライズに使用でき、Clojure自体もプログラムを表現するためにednのスーパーセットを使用します。
ednはJSONやXMLと同様の方法で使用されますが、比較的多くの組み込み要素があり、以下に例を示します。
true、false"foo bar"\c、\tabname:key1233.14(a b 42)[a b 42]{:a1,"foo":bar,[123]four}#{ab[123]}nil( nullのような値)これらの要素に加えて、タグを使用することで拡張性もサポートしています。タグは、文字の後に記号が続く形式です#。タグに遭遇すると、リーダーは次の要素の値を対応するハンドラーに渡し、ハンドラーはデータ値を返します。たとえば、これはタグ付き要素です。その解釈は、リーダーの適切なハンドラーによって異なります。#myapp/Person{:first"Fred":last"Mertz"}
拡張要素を他の要素との関係で定義することで、基本セットに含まれない要素を伝える際に、慣習や文脈に頼ることを避けることができる。
Clojure の主要プラットフォームはJavaですが[ 20 ] [ 37 ]、他のターゲット実装も存在します。その中で最も注目すべきものは ClojureScript [ 55 ]で、 ECMAScript 3 [ 56 ] (または ES5 や ES5-strict、ES-2021 まで、ES-next も可能) [ 57 ]にコンパイルされます。また、 .NETプラットフォームに完全に移植され、そのエコシステムと相互運用可能なClojureCLR [ 58 ]もあります。
異なるプラットフォームにおけるClojureのその他の実装例は以下のとおりです。
Clojure開発のためのツールは、長年にわたって大幅に改善されてきました。以下は、Clojureでのプログラミングをサポートするプラグインを備えた人気のあるIDEとテキストエディタのリストです。 [ 67 ]
コミュニティが提供するツールに加えて、Clojure 1.9以降、公式のClojureコマンドラインインターフェース(CLI)ツール[ 39 ]もLinux、macOS、Windowsで利用可能になりました。 [ 80 ]
開発プロセスは Clojure コア チームに限定されていますが、問題は Clojure JIRAプロジェクト ページで公開されています。[ 81 ]誰でも ask.clojure.org で質問したり、問題やアイデアを提出したりできます。[ 82 ]新しい問題が JIRA チケットに値すると判断された場合、コア チーム メンバーがそれをトリアージして追加します。JIRA の問題はスクリーナー チームによって処理され、最終的に Rich Hickey によって承認されます。[ 83 ] [ 84 ]
関数型プログラミングへの関心が続く中、Java プラットフォームを使用するソフトウェア開発者による Clojure の採用は増加し続けている。[ 85 ]また、この言語は Brian Goetz、[ 86 ] [ 87 ] [ 88 ] Eric Evans、[ 89 ] [ 90 ] James Gosling、[ 91 ] Paul Graham、[ 92 ] Robert C. Martin [ 93 ] [ 94 ] [ 95 ] [ 96 ]などのソフトウェア開発者からも推奨されている。ThoughtWorksは、Technology Radar [ 97 ]で関数型プログラミング言語を評価する際に、 2010 年に Clojure を「 JVM 上の Lisp のシンプルでエレガントな実装」と評し、2012 年に「ADOPT」ステータスに昇格させた。[ 98 ]
SnykとJava Magazineが共同で作成した「JVMエコシステムレポート2018」(「Java開発者に対する過去最大の調査」と謳われている)では、ClojureはJVM上で「メインアプリケーション」に2番目に多く使用されているプログラミング言語としてランク付けされている。[ 99 ] Clojureは、Apple [ 101 ] [ 102 ]、Atlassian [ 103 ] 、 Funding Circle [ 104 ]、Netflix [ 105 ]、Nubank [ 106 ]、Puppet [ 107 ]、Walmart [ 108 ]などの企業[ 100 ]や、NASA [ 109 ]などの政府機関で使用されている。また、視覚芸術、音楽、ゲーム、詩などのクリエイティブコンピューティングにも使用されている。[ 110 ]
Stack Overflow Developer Survey 2023年版では、Clojureはプログラミング言語およびスクリプト言語のカテゴリで4番目に高く評価されており、昨年Clojureを使用した回答者の68.51%が今後も使用したいと回答しています。しかし、希望するカテゴリでは、調査対象者のわずか2.2%しかClojureを希望すると回答しておらず、一方、最も高いスコアを獲得したJavaScriptは、調査に参加した開発者の40.15%から希望すると回答されています。 [ 111 ]