clojure&clojure script
DESCRIPTION
TRANSCRIPT
Clojure とClojureScript
Clojure とは• Rich Hickeyが開発した Lisp方言、 Java VM上で動く• Richは大学で作曲専攻、音楽系のソフトウェアを開発している。 Lisp->C++にポーティングする際にオブジェクト指向に嫌気がさして Clojure開発に着手した
• Richが2年半かけて開発、2008年6月に初期バージョンを発表、現在の最新バージョンは 1.6
なぜ Clojure か( Clojure の特徴)?• インタープリタ言語であること➩手軽なこと• 関数型言語であり、第一級関数が利用できること➩引数として関数が利用でき、短い効率的なコードがかけること
• JVM上で稼働すること➩ Javaの膨大な資産が利用できること、高速でスケーラビリティが高いこと
• データはイミュータブルで更新不可であること➩マルチコア、並列処理でもバグが発生しにくいこと
• ソフトウェアトランザクションメモリ (STM)により同期的更新も可能なこと➩ミュータブルにも対応
• Lisp言語であること➩処理とデータが同じ表現であり、マクロにより新たなシンタックスが定義できること
• 遅延束縛を提供➩シンプルな記述で性能と省メモリーを提供
類似の Scala との比較
http://www.infoq.com/jp/articles/the-joy-of-clojure
From The Joy of Clojure の著書の一人の Chris Houser氏
調査 : もっとも表現力に富んだ汎用プログラム言語は Clojure , CoffeeScript , Haskell
http://www.infoq.com/jp/news/2013/04/Language-Expressiveness
Clojureのコアライブラリは高々 8KLines
Scala vs Clojure
Scala: Adorned Overflowing Magnificent
Clojure: Clean Structured Focused
どんな人が Clojure を使うか• ベンチャーでいちはやくサービスや製品を提供したい
• でも、事業の拡大に対してスケーラビリティを担保したい
• 少人数でスキルの高い技術者でチームを固めたい• 関数型言語を極めたい、かつ実用的なソフトウェアを作りたい•制御構造がないので、再帰もしくはmapで記述•基本的にはデータの更新ができない モナド➩
• Javaの資産を活用したい• Lispを勉強したい
Java プログラムとの比較public class StringUtils { public static boolean isBlank(String str) { int strLen; if (str == null || (strLen = str.length()) == 0) { return true; } for (int i = 0; i < strLen; i++) { if ((Character.isWhitespace(str.charAt(i)) == false)) { return false; } } return true; }}
(defn blank? [str] (every? #(Character/isWhitespace %) str))
Java
Clojure
Javaの 1/10程度のコード量で記述可能Programming Clojure(Stuart Halloway,Aaron Bedra)より
Clojure の事例• CEP(Complex Event Processing)のひとつである
twitter Stormのベース部分はClojureで書かれており、秒 100万件のイベントを処理可能である
• 次世代のDatabaseである datomicは clojureで記述されている。
• ビッグデータ、データ分析とは親和性が高い• cascalog、 incanter、 clojuraticaなど
• Akamai、 citi bankなどで利用されている• http://
dev.clojure.org/display/community/Clojure+Success+Stories
• 東大発のベンチャー企業のテンクー (Xcoo,Inc)が開発した研究者のためのゲノム解析 /可視化のクラウドサービスはすべて clojureで記述されている• https://chrov.is/
Clojure で Hello World$ lein replnREPL server started on port 42412 on host 127.0.0.1REPL-y 0.3.0Clojure 1.5.1 Docs: (doc function-name-here) (find-doc "part-of-name-here") Source: (source function-name-here) Javadoc: (javadoc java-object-or-class-here) Exit: Control+D or (exit) or (quit) Results: Stored in vars *1, *2, *3, an exception in *e
user=> (+ 1 2 3)6user=> (println "Hello World")Hello Worldniluser=> (javax.swing.JOptionPane/showMessageDialog nil "Hello World")niluser=> Bye for now!
ClojureScript とは• JavaScriptを生成する clojureベースのコンパイラである
• Google closureライブラリを用いてコンパイルする
• CoffeeScript、 TypeScriptと同様の位置づけであるが、ブラウザロジックを Lispで記述する• ClojureScriptは Google closureでの最適化を行うので高速、短いコンパイルコードになる
• ClojureScriptと JavaScriptはどちらも型なし言語なので相性がよい
• ブラウザのみならず、 nodejsのコードも作成可能(必要性はあまりないが。。。)
ClojureScript 実行の流れ
ClojureScriptREPL
Browser REPLclient
Effect
Browser REPL
server
JVM browser
JS転送結果
ClojureScriptソースコード
JavaScript 最適化されたJavaScript
ClojureScriptコンパイラ
Google closureコンパイラ
Java VM
コード入力
ClojureScript の実例• Chris Gingerが KickStarterで資金を調達して開発しているもっともシンプルで軽量かつ美しいエディタといわれる LightTableは1万行程度のClojureScriptで書かれている• プラグインによるフルカスタマイズ• Live Evaluation機能
• ClojureScript+Facebook ReactJSを利用したDevid Nolenの omが最も ClojureScript界隈で最もHotになっていてメーリングリストでは毎日数10通のやりとりがなされている。• コンポーネントのサポート• ReactJSが提供する Virtual Domと Clojureの immutableの親和性 高速な➩ JavaScriptソフトウェアの作成
ClojureScript で Hello World
$ lein trampoline cljsbuild repl-rhinoRunning Rhino-based ClojureScript REPL.To quit, type: :cljs/quitClojureScript:cljs.user> (+ 1 2 3)6ClojureScript:cljs.user> (println "Hello World")Hello WorldnilClojureScript:cljs.user>
Browser-repl での HelloWorld