Skip to content

Instantly share code, notes, and snippets.

@tnoda
Created November 16, 2012 11:50
Show Gist options
  • Save tnoda/4086709 to your computer and use it in GitHub Desktop.
Save tnoda/4086709 to your computer and use it in GitHub Desktop.
A small rant about ClojureScript

みじかい ClojureScript のはなし

Introduction

知っていますか? (1)

  • ClojureScript
  • JavaScript
  • js\_of\_ocaml
  • TypeScript
  • CoffeeScript

JavaScript を何とかしたい人は多い

\centering

digraph {
  graph [rankdir=LR]
  ClojureScript->JavaScript;
  js_of_ocaml->JavaScript;
  TypeScript->JavaScript;
  CoffeeScript->JavaScript;
}

ClojureScript ≠ Clojure $+$ Script

  • Clojure
  • ClojureScript

Clojure

知っていますか? (2)

  • Clojure
  • Java
  • Scala
  • Groovy

Java を何とかしたい人は多い

\centering

digraph {
  graph [rankdir=LR]
  Clojure->Java;
  Scala->Java;
  Groovy->Java;
}

Clojure

\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 …)

Clojure

\centering

clojure.png

  • Java
    • Primitives, classes, methods, and objects.
  • clojure.core
    • Immutable/Persistent data structures
    • Lazy sequences
    • Macro system

Java vs. Clojure (1): Syntax

Java

ArrayList list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);

Clojure

(let [alist (ArrayList.)]
  (.add alist 1)
  (.add alist 2)
  (.add alist 3))

Java vs. Clojure (2): Macro

Java

ArrayList list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);

Clojure

(doto (ArrayList.)
  (.add 1)
  (.add 2)
  (.add 3))

ClojureScript

Clojure

\centering

clojure.png

ClojureScript

\centering

+------------------+-------------------+
|cYEL  Syntax      |cYEL  Syntax       |
+------------------+-------------------+
|cPNK              |cBLU               |
|    JavaScript    |   clojure.core    |
|                  |                   |
+------------------+-------------------+

JavaScript vs. ClojureScript (1)

JavaScript

var message = "Hello, World!";
var msg_length = message.length;
var insult = message.replace(/World/, "idiots");

ClojureScript

(def message "Hello, World!")
(def msg_length (.-length message))
(def insult (.replace message #"World" "idiots"))

JavaScript vs. ClojureScript (2)

JavaScript

new Data(2012, 11, 15);

ClojureScript

(js/Date. 2012 6 16)

JavaScript vs. ClojureScript (3)

JavaScript

var today = Date();

ClojureScript

(def today (js/Date))

ClojureScript

\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

Compilation

\centering

+---------+    +---------------+    +-------+
|cYEL     |    | ClojureScript |    :       |
|  .cljs  |--->|   Compiler    |-=->|  .js  |
|{d}      |    |cGRE           |    |{d}    |
+---------+    +---------------+    +-------+
                       |
                       |
                       v
               +---------------+    +-------+
               |Google Closure |    |cPNK   |
               |   Compiler    |--->|  .js  |
               |cRED           |    |{d}    |
               +---------------+    +-------+

Google Closure Compiler

  • js->js
  • JavaScript コードを最適化・高速化
    • \alert{最適化は人間ではなくコンパイラのお仕事です.}
  • JavaScript の問題点の一つを解決
    • “JavaScript: The Good Parts”
    • 速い JavaScript を書くためのバッドノウハウ収集癖

Google Closure Compiler の問題点

\alert{どんな js でも最適化できるわけではない}

  • Google Closure Compiler の作法に従ったコードのみ最適化可
    • 作法に違反したコードをコンパイルすると最悪正常動作しない
  • 既視感
    • Google 版 “JavaScript: The Good Parts”
    • 作法に従ったコードを書くための設計ノウハウ収集癖

もうノーサイドにしましょう

\centering compilation.png

  • ClojureScript コンパイラは Google Closure Library が正しくコンパイルできる js を出力します.
  • ClojureScript で書くだけで最適化された js を手に入れることができます.
  • 機能に集中しましょう.
    • バッドノウハウを収集するのは終わりにしましょう.

Conclusion

おわりに

  • ClojureScript とは
  • ClojureScript はこんな人におすすめ
  • 学習のためのリソース

ClojureScript とは

  • JavaScript のように使える言語
    • JavaScript のオブジェクト,プリミティブ
  • JavaScript とは違う文法
    • 関数前置 (func arg0 arg1 ...)
  • 関数型プログラミング
    • 永続データ構造,遅延シーケンス, map filter reduce
  • 人力ではなくコンパイラによる自動最適化

ClojureScript はこんな人におすすめ

  • 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
\AtBeginDvi{\special{pdf:tounicode EUC-UCS2}}
\usetheme{Rochester}
\usecolortheme[RGB={88,129,216}]{structure}
\renewcommand{\kanjifamilydefault}{\gtdefault}
\usefonttheme{structurebold}
\setbeamertemplate{blocks}[shadow=true,rounded]
\setbeamertemplate{navigation symbols}{}
@tnoda
Copy link
Author

tnoda commented Nov 16, 2012

A presentation given at the Kyoto JavaScript User Group meetup (kyoto.js #1).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment