Clojure
Clojure (発音は/'klouʒər/[3], クロージャー)は、関数型プログラミング言語であり、LISP方言の一つである。関数型プ�…
|
Clojureのロゴ | |
| パラダイム | 関数型言語, マルチパラダイム |
|---|---|
| 登場時期 | 2007年 |
| 設計者 | Rich Hickey |
| 最新リリース | 1.12.5 / 2026年5月12日[1] |
| 型付け | 動的型付け, 強い型付け |
| 影響を受けた言語 | LISP, ML, Haskell, Erlang[2] |
| プラットフォーム | Java仮想マシン |
| ライセンス | Eclipse Public License |
| ウェブサイト |
clojure |
| 登場時期 | 2010年 |
|---|---|
| 設計者 | Rich Hickey |
| 最新リリース | 1.11.0/ 2022年8月22日 |
| プラットフォーム | .NET |
| ライセンス | Eclipse Public License |
| ウェブサイト |
github |
Clojure (発音は/'klouʒər/[3], クロージャー)は、関数型プログラミング言語であり、LISP方言の一つである。関数型プログラミングのプログラミングスタイルでのインタラクティブな開発を支援し、マルチスレッドプログラムの開発を容易化する汎用言語である。ClojureのプログラムはJava仮想マシンで動作する。.NETで動作するClojureCLRも開発されている。Clojureは「データとしてのプログラムコード」 (英語:「code as data」) という思想で設計されており、洗練されたマクロ機構を持つ。
設計思想
リッチ・ヒッキー (Rich Hickey)がClojureを設計した目的は、既存のJavaプラットフォーム上で動作して、並行コンピューティングができる、関数型のLISP系の言語を作ることである。[4][5]
Clojureが並行コンピューティングを実現する手法は、不変(イミュータブル)な状態の連鎖という概念によって特徴づけられる。 [6]状態が不変であるため、ひとつの状態に対して複数の操作を並列に行うことができ、並列性という問題が「状態遷移の管理」になる。そのため、Clojureには、状態遷移に関して明確な定義をもつ可変な参照型がいくつか用意されている。
文法
他のLISP系言語と同様、ClojureのプログラムはS式で表現する。プログラムコードはコンパイルされる前に、リーダーによって解析され、内部データ構造に変換される。Clojureのリーダーは、リストの他に配列・ハッシュテーブル・集合もリテラル表現として扱うことができ、そのままコンパイラに渡される。言いかえると、Clojureのコンパイラはリストだけでなく、上に挙げた全てのデータ構造を直接扱うことができるということである。ClojureはLisp-1であり、関数名と変数名は同一名前空間にある。また、他のLISP系言語とのコードの互換性は考慮されていない。
マクロ
Clojureのマクロ機構は、Common Lispのそれによく似ている。ただし、Clojureのバッククオート(「シンタクス・クオート」と呼ばれる)では、個々の記号が局所的な名前空間によって区別されるという点で、Common Lispのマクロとは異なっている。この仕組みによって、マクロ展開時の変数の捕獲(= マクロが展開された環境に同名の変数があると、その変数の値が変更されてしまうこと)を避けている。マクロ展開時の変数の捕獲を許容するように強制することもできるが、それは明示的に行わなければならない。また、Clojureでは、現在の名前空間にインポートされた別の名前空間の大域名を変更することは許容されていない。
言語の特徴
- 対話型評価環境(REPL)による動的な開発ができる。
- 関数が第一級のオブジェクトであり、副作用に基いたループを使わずに、再帰呼び出しを動作原理とするものであること。
- 遅延シーケンス (英語: lazy sequence)
- イミュータブルで永続なたくさんのデータ構造
- ソフトウェアトランザクショナルメモリ、
agentシステム、動的varシステムを使った並行コンピューティング - Java仮想マシンのバイトコードを生成するコンパイラ言語であること。
- マルチメソッドにより、複数の引数の型の組み合わせで実行される処理内容を変更することができる。(普通のオブジェクト指向言語のポリモーフィズムでは、ただ1つの引数によって決定される)
- Javaとの密接な統合: Java仮想マシンのバイトコードにコンパイルされるため、Clojureで作られたアプリケーションソフトは、Javaの既存のシステムを生かすことができる。そのため、アプリケーションのパッケージ化やアプリケーションサーバーへの配備も容易に行える。また、この言語のマクロ機構を使えば、既存の Java API の呼び出しも容易に行える。さらに、Clojureのデータ構造はいずれも、Java の標準的なインターフェースを実装しているので、Java言語の側からClojureのプログラムを呼び出すのも簡単である。
例
Hello World
CUI版のHello World:
(println "Hello, world!")
GUI版の Hello World:
(javax.swing.JOptionPane/showMessageDialog nil "Hello World")
スレッドセーフ
重複しない通し番号の、スレッドセーフな生成器
(let [i (atom 0)]
(defn generate-unique-id
"Returns a distinct numeric ID for each call."
[]
(swap! i inc)))
無名クラス、マクロ
ダミーのjava.io.Writerのサブクラスを無名クラスとして作成し、それを使って、内部のprint関数からの全ての出力を無効にするようなマクロを定義。
(def bit-bucket-writer
(proxy [java.io.Writer] []
(write [buf] nil)
(close [] nil)
(flush [] nil)))
(defmacro noprint
"Evaluates the given expressions with all printing to *out* silenced."
[& forms]
`(binding [*out* bit-bucket-writer]
~@forms))
(noprint
(println "Hello, nobody!"))
ソフトウェアトランザクショナルメモリ
それぞれに10個の値の入った長さ100の配列(vector)があり、10×100=1,000個の異なる連続した数が格納されている。これら100個のvectorを16個のスレッドで共有する。各スレッドは、ランダムに2つのvectorを選びそれぞれの配列でランダムな位置を決めて、二つの配列の要素の内容を交換する、という作業をClojureのソフトウェアトランザクショナルメモリを使って行う。この作業を300,000回繰り返しても、最初に格納されていた1,000個の数はどれひとつとして失われることがない。
(defn run [nvecs nitems nthreads niters]
(let [vec-refs (vec (map (comp ref vec)
(partition nitems (range (* nvecs nitems)))))
swap #(let [v1 (rand-int nvecs)
v2 (rand-int nvecs)
i1 (rand-int nitems)
i2 (rand-int nitems)]
(dosync
(let [temp (nth @(vec-refs v1) i1)]
(alter (vec-refs v1) assoc i1 (nth @(vec-refs v2) i2))
(alter (vec-refs v2) assoc i2 temp))))
report #(do
(prn (map deref vec-refs))
(println "Distinct:"
(count (distinct (apply concat (map deref vec-refs))))))]
(report)
(dorun (apply pcalls (repeat nthreads #(dotimes [_ niters] (swap)))))
(report)))
(run 100 10 16 300000)
脚注
- ^ 題名: Release 1.12.5, 出典URL: https://github.com/clojure/clojure/releases/tag/clojure-1.12.5, 閲覧日: 2026年5月13日, 出版日: 2026年5月12日
- ^ Rich Hickey (2009年6月30日). “Books that influenced Clojure”. 2009年9月11日閲覧。
- ^ “meaning and pronunciation of Clojure”. Rich Hickey. 2014年6月20日閲覧。
- ^ “Rationale”. Rich Hickey. clojure.org. 2008年10月17日閲覧。
- ^ http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Rich-Hickey-and-Brian-Beckman-Inside-Clojure/
- ^ “On State and Identity”. Rich Hickey. clojure.org. 2010年3月1日閲覧。
文献
- Halloway, Stuart (2009年5月28日), Programming Clojure (1st ed.), Pragmatic Bookshelf, pp. 304, ISBN 1934356336
- VanderHart, Luke (2009年12月31日), Practical Clojure (1st ed.), Apress, pp. 350, ISBN 1430272317
- Rathore, Amit (2009年12月), Clojure in Action (1st ed.), Manning, pp. 475, ISBN 9781935182597
- Fogus, Michael; Houser, Chris (2010年1月), The Joy of Clojure (1st ed.), Manning, pp. 300, ISBN 9781935182641
外部リンク
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.