「Clojure」の版間の差分

提供: miniwiki
移動先:案内検索
(1版 をインポートしました)
(内容を「{{テンプレート:20180815sk}} __NOINDEX__」で置換)
(タグ: Replaced)
 
1行目: 1行目:
{{Infobox programming language
+
{{テンプレート:20180815sk}} __NOINDEX__
|name = Clojure
 
|logo =
 
|paradigm = [[関数型言語]], [[マルチパラダイムプログラミング言語|マルチパラダイム]]
 
|year = 2007
 
|designer = Rich Hickey
 
|latest_release_version = 1.9
 
|latest_release_date = {{release date|2017|12|08}}
 
|typing = [[動的型付け]], [[強い型付け]]
 
|implementations =
 
|dialects =
 
|influenced_by = [[LISP]], [[ML (プログラミング言語)|ML]], [[Haskell]], [[Erlang]]<ref>{{cite web |title=Books that influenced Clojure |url=http://www.amazon.com/gp/richpub/listmania/fullview/R3LG3ZBZS4GCTH |date=30 June 2009 |author=Rich Hickey |accessdate=11 September 2009}}</ref>
 
|influenced =
 
|operating_system = [[クロスプラットフォーム]]
 
|license = [[Eclipse Public License]]
 
|website = {{url|http://clojure.org/}}
 
}}
 
 
 
'''{{lang|en|Clojure}}''' (発音は{{ipa|'klouʒər}}<ref>{{cite web |url=https://groups.google.com/d/msg/clojure/4uDxeOS8pwY/UHiYp7p1a3YJ|title=meaning and pronunciation of Clojure | work=Rich Hickey | accessdate=2014-06-20}}</ref>, クロージャー)は[[プログラミング言語]]であり、[[LISP]]系の言語の[[方言 (プログラミング言語)|方言]]の一つである。[[関数型プログラミング]]のプログラミングスタイルでのインタラクティブな開発を支援し、[[スレッド (コンピュータ)|マルチスレッド]]プログラムの開発を容易化する汎用言語である。{{lang|en|Clojure}}言語のプログラムは[[Java仮想マシン]]と[[共通言語ランタイム|Microsoft .NET 共通言語ランタイム]]で動作する。{{lang|en|Clojure}}言語は「データとしてのプログラムコード」 (英語:「{{lang|en|code as data}}」) という思想で設計されており、洗練された[[マクロ (コンピュータ用語)|マクロ機構]]を持つ。
 
 
 
==設計思想==
 
リッチ・ヒッキー ({{lang|en|Rich Hickey}})が{{lang|en|Clojure}}言語を設計した目的は、既存の[[Javaプラットフォーム]]上で動作して、[[並行コンピューティング]]ができる、[[関数型言語|関数型]]の[[LISP]]系の言語を作ることである。<ref>{{cite web |url=http://clojure.org/rationale| title=Rationale | work=Rich Hickey | publisher=clojure.org | accessdate=2008-10-17}}</ref><ref>http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Rich-Hickey-and-Brian-Beckman-Inside-Clojure/</ref>
 
 
 
{{lang|en|Clojure}}言語が並行コンピューティングを実現する手法は、[[イミュータブル|不変(イミュータブル)]]な状態の連鎖という概念によって特徴づけられる。
 
<ref> {{cite web |url=http://clojure.org/state| title=On State and Identity | work=Rich Hickey | publisher=clojure.org | accessdate=2010-03-01}}</ref>状態が不変であるため、ひとつの状態に対して複数の操作を並列に行うことができ、並列性という問題が「状態遷移の管理」になる。そのため、{{lang|en|Clojure}}言語には、状態遷移に関して明確な定義をもつ可変な参照型がいくつか用意されている。
 
 
 
==文法==
 
他の[[LISP]]系言語と同様、{{lang|en|Clojure}}言語のプログラムは[[S式]]で表現する。プログラムコードはコンパイルされる前に、''リーダー''によって解析され、内部データ構造に変換される。{{lang|en|Clojure}}言語のリーダーは、[[リスト (抽象データ型)|リスト]]の他に[[配列]]・[[ハッシュテーブル]]・[[集合]]も[[リテラル|リテラル表現]]として扱うことができ、そのままコンパイラに渡される。言いかえると、{{lang|en|Clojure}}のコンパイラはリストだけでなく、上に挙げた全てのデータ構造を直接扱うことができるということである。{{lang|en|Clojure}}言語は[[Common Lisp|Lisp-1]]であり、関数名と変数名は同一名前空間にある。また、他のLISP系言語とのコードの互換性は考慮されていない。
 
 
 
==マクロ==
 
{{lang|en|Clojure}}言語の[[マクロ (コンピュータ用語)|マクロ機構]]は、[[Common Lisp]]のそれによく似ている。ただし、{{lang|en|Clojure}}言語のバッククオート(「シンタクス・クオート」と呼ばれる)では、個々の記号が局所的な名前空間によって区別されるという点で、{{lang|en|Common Lisp}}のマクロとは異なっている。この仕組みによって、マクロ展開時の変数の捕獲(= マクロが展開された環境に同名の変数があると、その変数の値が変更されてしまうこと)を避けている。マクロ展開時の変数の捕獲を許容するように強制することもできるが、それは明示的に行わなければならない。また、{{lang|en|Clojure}}言語では、現在の名前空間にインポートされた別の名前空間の大域名を変更することは許容されていない。
 
 
 
==言語の特徴==
 
*[[対話型評価環境]]([[REPL]])による動的な開発ができる。
 
*[[第一級関数|関数が第一級のオブジェクト]]であり、[[副作用 (プログラム)|副作用]]に基いたループを使わずに、[[再帰|再帰呼び出し]]を動作原理とするものであること。
 
*遅延シーケンス (英語: {{lang|en|lazy sequence}})
 
*[[イミュータブル]]で[[永続データ構造|永続]]なたくさんのデータ構造
 
*[[ソフトウェアトランザクショナルメモリ]]、<code>{{lang|en|agent}}</code>システム、動的<code>{{lang|en|var}}</code>システムを使った[[並行コンピューティング]]
 
*[[Java仮想マシン]]の[[バイトコード]]を生成する[[コンパイラ言語]]であること。
 
*[[多重ディスパッチ|マルチメソッド]]により、複数の引数の型の組み合わせで実行される処理内容を変更することができる。(普通のオブジェクト指向言語のポリモーフィズムでは、ただ1つの引数によって決定される)
 
*[[Java]]との密接な統合: Java仮想マシンのバイトコードにコンパイルされるため、{{lang|en|Clojure}}言語で作られた[[アプリケーションソフト]]は、Javaの既存のシステムを生かすことができる。そのため、アプリケーションのパッケージ化やアプリケーションサーバーへの[[ソフトウェアデプロイメント|配備]]も容易に行える。また、この言語のマクロ機構を使えば、既存の {{lang|en|Java API}} の呼び出しも容易に行える。さらに、{{lang|en|Clojure}}言語のデータ構造はいずれも、{{lang|en|Java}} の標準的なインターフェースを実装しているので、{{lang|en|Java}}言語の側から{{lang|en|Clojure}}言語のプログラムを呼び出すのも簡単である。
 
 
 
==例==
 
===Hello World===
 
 
 
CUI版の[[Hello world|Hello World]]:
 
 
 
<source lang="lisp">
 
(println "Hello, world!")
 
</source>
 
 
 
GUI版の Hello World:
 
 
 
<source lang="lisp">
 
(javax.swing.JOptionPane/showMessageDialog nil "Hello World")
 
</source>
 
 
 
===スレッドセーフ===
 
重複しない通し番号の、[[スレッドセーフ]]な生成器
 
 
 
<source lang="lisp">
 
(let [i (atom 0)]
 
  (defn generate-unique-id
 
    "Returns a distinct numeric ID for each call."
 
    []
 
    (swap! i inc)))
 
</source>
 
 
 
===無名クラス、マクロ===
 
ダミーの<code>[http://java.sun.com/javase/6/docs/api/java/io/Writer.html java.io.Writer]</code>のサブクラスを無名クラスとして作成し、それを使って、内部のprint関数からの全ての出力を無効にするようなマクロを定義。
 
 
 
<source lang="lisp">
 
(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!"))
 
</source>
 
 
 
===ソフトウェアトランザクショナルメモリ===
 
 
 
それぞれに10個の値の入った長さ100の配列({{lang|en|vector}})があり、10×100=1,000個の異なる連続した数が格納されている。これら100個の{{lang|en|vector}}を16個のスレッドで共有する。各スレッドは、ランダムに2つの{{lang|en|vector}}を選びそれぞれの配列でランダムな位置を決めて、二つの配列の要素の内容を交換する、という作業を{{lang|en|Clojure}}言語の[[ソフトウェアトランザクショナルメモリ]]を使って行う。この作業を300,000回繰り返しても、最初に格納されていた1,000個の数はどれひとつとして失われることがない。
 
 
 
<source lang="lisp">
 
(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)
 
</source>
 
 
 
==脚注==
 
{{reflist}}
 
 
 
==文献==
 
{{Refbegin}}
 
* {{citation
 
| first1      = Stuart
 
| last1      = Halloway
 
| date        = 2009年5月28日
 
| title      = Programming Clojure
 
| publisher  = Pragmatic Bookshelf
 
| edition    = 1st
 
| pages      = 304
 
| isbn        = 1934356336
 
| url        = http://pragprog.com/titles/shcloj/programming-clojure
 
}}
 
* {{citation
 
| first1      = Luke
 
| last1      = VanderHart
 
| date        = 2009年12月31日
 
| title      = Practical Clojure
 
| publisher  = Apress
 
| edition    = 1st
 
| pages      = 350
 
| isbn        = 1430272317
 
| url        = http://www.apress.com/book/view/9781430272311
 
}}
 
* {{citation
 
| first1      = Amit
 
| last1      = Rathore
 
| date        = 2009年12月
 
| title      = Clojure in Action
 
| publisher  = Manning
 
| edition    = 1st
 
| pages      = 475
 
| isbn        = 9781935182597
 
| url        = http://www.manning.com/rathore/
 
}}
 
* {{citation
 
| first1      = Michael
 
| last1      = Fogus
 
| first2      = Chris
 
| last2      = Houser
 
| date        = 2010年1月
 
| title      = The Joy of Clojure
 
| publisher  = Manning
 
| edition    = 1st
 
| pages      = 300
 
| isbn        = 9781935182641
 
| url        = http://www.manning.com/fogus/
 
}}
 
{{Refend}}
 
 
 
==外部リンク==
 
*[http://clojure.org/ Clojure言語 公式ウェブサイト]
 
*[http://github.com/clojure/clojure Clojure言語 GitHub コード・リポジトリ]
 
*[http://java.ociweb.com/mark/clojure/article.html Clojure言語の総合解説]
 
*[http://vimeo.com/channels/fulldisclojure Full Disclojure - Screencast]
 
*[http://www.ibm.com/developerworks/jp/opensource/library/os-eclipse-clojure/ developerWorks JapanのClojure言語解説記事(日本語)]
 
*[http://clojure-conj.org/ Clojure conj 開発者会議]
 
 
 
{{LISP系言語}}
 
{{Java}}
 
 
 
{{DEFAULTSORT:くろうしや}}
 
[[Category:LISP|CLOJURE]]
 
[[Category:関数型言語|CLOJURE]]
 
[[Category:プログラミング言語|CLOJURE]]
 

2019/6/16/ (日) 08:34時点における最新版



楽天市場検索: