Clojure

プログラミング言語であり、LISP系言語の方言

Clojure (発音は/'klouʒər/[3], クロージャー)は、関数型プログラミング言語であり、LISP方言の一つである。関数型プログラミングのプログラミングスタイルでのインタラクティブな開発を支援し、マルチスレッドプログラムの開発を容易化する汎用言語である。Clojure言語のプログラムはJava仮想マシンで動作する。.NETで動作するClojureCLRも開発されている。Clojure言語は「データとしてのプログラムコード」 (英語:「code as data」) という思想で設計されており、洗練されたマクロ機構を持つ。

Clojure
Clojure
Clojureのロゴ
パラダイム 関数型言語, マルチパラダイム
登場時期 2007年 (2007)
設計者 Rich Hickey
最新リリース 1.12.0 / 2024年9月5日[1]
型付け 動的型付け, 強い型付け
影響を受けた言語 LISP, ML, Haskell, Erlang[2]
プラットフォーム Java仮想マシン
ライセンス Eclipse Public License
ウェブサイト clojure.org
テンプレートを表示
ClojureCLR
登場時期 2010年 (2010)
設計者 Rich Hickey
最新リリース 1.11.0/ 2022年8月22日 (2年前) (2022-08-22)
プラットフォーム .NET
ライセンス Eclipse Public License
ウェブサイト github.com/clojure/clojure-clr
テンプレートを表示

設計思想

編集

リッチ・ヒッキー (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言語では、現在の名前空間にインポートされた別の名前空間の大域名を変更することは許容されていない。

言語の特徴

編集

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)

脚注

編集
  1. ^ 出典URL: https://github.com/clojure/clojure/releases/tag/clojure-1.12.0, 閲覧日: 2024年9月18日, 題名: Release 1.12.0, 出版日: 2024年9月5日
  2. ^ Rich Hickey (30 June 2009). “Books that influenced Clojure”. 11 September 2009閲覧。
  3. ^ meaning and pronunciation of Clojure”. Rich Hickey. 2014年6月20日閲覧。
  4. ^ Rationale”. Rich Hickey. clojure.org. 2008年10月17日閲覧。
  5. ^ http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Rich-Hickey-and-Brian-Beckman-Inside-Clojure/
  6. ^ 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, http://pragprog.com/titles/shcloj/programming-clojure 
  • VanderHart, Luke (2009年12月31日), Practical Clojure (1st ed.), Apress, pp. 350, ISBN 1430272317, http://www.apress.com/book/view/9781430272311 
  • Rathore, Amit (2009年12月), Clojure in Action (1st ed.), Manning, pp. 475, ISBN 9781935182597, http://www.manning.com/rathore/ 
  • Fogus, Michael; Houser, Chris (2010年1月), The Joy of Clojure (1st ed.), Manning, pp. 300, ISBN 9781935182641, http://www.manning.com/fogus/ 

外部リンク

編集