- ClojureScript
- JavaScript
- js\_of\_ocaml
- TypeScript
- CoffeeScript
\centering
digraph {
graph [rankdir=LR]
ClojureScript->JavaScript;
js_of_ocaml->JavaScript;
TypeScript->JavaScript;
CoffeeScript->JavaScript;
}
- Clojure
- ClojureScript
- Clojure
- Java
- Scala
- Groovy
\centering
digraph {
graph [rankdir=LR]
Clojure->Java;
Scala->Java;
Groovy->Java;
}
\centering
+------------------+-------------------+
|cYEL Syntax |cYEL Syntax |
+------------------+-------------------+
|cRED |cBLU |
| Java | clojure.core |
| | |
+------------------+-------------------+
- Syntax (Java)
(ClassName. arg0 arg1 ...)
(ClassName/staticMethod arg0 arg1 ...)
(.method obj arg0 arg1 ...)
- Syntax (Clojure)
- (func arg0 arg1 …)
\centering
- Java
- Primitives, classes, methods, and objects.
clojure.core
- Immutable/Persistent data structures
- Lazy sequences
- Macro system
ArrayList list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
(let [alist (ArrayList.)]
(.add alist 1)
(.add alist 2)
(.add alist 3))
ArrayList list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
(doto (ArrayList.)
(.add 1)
(.add 2)
(.add 3))
\centering
\centering
+------------------+-------------------+
|cYEL Syntax |cYEL Syntax |
+------------------+-------------------+
|cPNK |cBLU |
| JavaScript | clojure.core |
| | |
+------------------+-------------------+
var message = "Hello, World!";
var msg_length = message.length;
var insult = message.replace(/World/, "idiots");
(def message "Hello, World!")
(def msg_length (.-length message))
(def insult (.replace message #"World" "idiots"))
new Data(2012, 11, 15);
(js/Date. 2012 6 16)
var today = Date();
(def today (js/Date))
\centering
+------------------+-------------------+
|cYEL Syntax |cYEL Syntax |
+------------------+-------------------+
|cPNK |cBLU |
| JavaScript | clojure.core |
| | |
+------------------+-------------------+
- JavaScript
- Primitives, classes, methods, and objects.
clojure.core
- Immutable/Persistent data structures
- Lazy sequences
- Macro system
\centering
+---------+ +---------------+ +-------+
|cYEL | | ClojureScript | : |
| .cljs |--->| Compiler |-=->| .js |
|{d} | |cGRE | |{d} |
+---------+ +---------------+ +-------+
|
|
v
+---------------+ +-------+
|Google Closure | |cPNK |
| Compiler |--->| .js |
|cRED | |{d} |
+---------------+ +-------+
js->js
- JavaScript コードを最適化・高速化
- \alert{最適化は人間ではなくコンパイラのお仕事です.}
- JavaScript の問題点の一つを解決
- “JavaScript: The Good Parts”
- 速い JavaScript を書くためのバッドノウハウ収集癖
\alert{どんな js でも最適化できるわけではない}
- Google Closure Compiler の作法に従ったコードのみ最適化可
- 作法に違反したコードをコンパイルすると最悪正常動作しない
- 既視感
- Google 版 “JavaScript: The Good Parts”
- 作法に従ったコードを書くための設計ノウハウ収集癖
- ClojureScript コンパイラは Google Closure Library が正しくコンパイルできる
js
を出力します. - ClojureScript で書くだけで最適化された
js
を手に入れることができます. - 機能に集中しましょう.
- バッドノウハウを収集するのは終わりにしましょう.
- ClojureScript とは
- ClojureScript はこんな人におすすめ
- 学習のためのリソース
- JavaScript のように使える言語
- JavaScript のオブジェクト,プリミティブ
- JavaScript とは違う文法
- 関数前置
(func arg0 arg1 ...)
- 関数前置
- 関数型プログラミング
- 永続データ構造,遅延シーケンス,
map filter reduce
- 永続データ構造,遅延シーケンス,
- 人力ではなくコンパイラによる自動最適化
- Google Closure Compiler を使うべき人
- 速い JS を書くためのバッドノウハウの蓄積に疑問.
- 大規模な JS アプリケーションを開発.
- Google Closure Library を既に利用している人
- ClojureScript は Google Closure Library を 基盤にしているので相性が良い.
- 次にあてはまらない人
- JS ライブラリ開発者 (TypeScript か CoffeeScript を推奨)
- OCaml プログラマ (
js_of_ocaml
最強)
- 書籍
- Stuart Sierra, Luke VanderHart, “ClojureScript: Up and Running”, O’Reilly Media, October 2012.
- Chas Emerick, Brian Carper, Christophe Grand, “Clojure Programming”, O’Reilly Media, April 2012.
- Twitter
@halcat0x15a
- http://togetter.com/li/291629 - ClojureScript のススメ
A presentation given at the Kyoto JavaScript User Group meetup (kyoto.js #1).