特長
● Lisp
● 関数型プログラミングのためのもの
● 確固たるプラットフォームと共生するJVM, .NET, Javascript上でそれらの型,GC,例外機構を利用しながら動作する
● Concurrencyのためにデザインされた
http://clojure.org/rationale
Conceptualなところがおもしろい
https://github.com/matthiasn/talk-transcripts
その中から特徴的なものをご紹介しますその中から特徴的なものをご紹介します
Simple made easy
Clojureにおける(というよりRich Hickeyの?)
シンプルさ、の考え方
http://www.infoq.com/presentations/Simple-Made-Easy
複雑 シンプル
状態、オブジェクト状態、オブジェクト 値値メソッドメソッド 関数、ネームスペース関数、ネームスペースvarvar Managed refsManaged refs継承、マッチング継承、マッチング ポリモーフィズムポリモーフィズム文法文法 データデータ命令的なループ命令的なループ 集合関数集合関数アクターアクター キューキューORMORM 宣言的なデータ操作宣言的なデータ操作条件条件 ルールルール
Complex or Simple
複雑 構成物
状態 触るものみな複雑
オブジェクト 状態、アイデンティティ、値
メソッド 関数、状態、ネームスペース
文法 意味と順序
命令的なループ 集合関数
アクター What / Who条件 複数のルール
複雑さのもとは組み合わせ
シンプルなもの 実現方法値 Final,永続的なコレクション関数 ステートレスなメソッドネームスーペース 言語のサポートデータ Maps,Arrays,SetsやJSON,XMLポリモーフィズム プロトコル、型クラスManaged refs ClojureやHaskellのrefsルール ライブラリ、Prolog
シンプルさのツールボックス
10のデータ構造それぞれに10の関数操作があるよりも、1つのデータ構造に100の関数操作がある方がよい
Alan J. Perils
http://www.cs.yale.edu/homes/perlis-alan/quotes.html
Abstraction
seq
http://www.slideshare.net/alexmiller/clojure-the-art-of-abstraction-7161663/40
● String
● Java collection
● Java iterator
● ResultSet
● XML
● ファイルの行
Concurrency
Clojureを使いたくなる本をご紹介しておきます。
https://pragprog.com/book/pb7con/seven-concurrency-models-in-seven-weeks
Immutableすべてがイミュータブル
user => (def a {:name "kawasima":age 39})#'user/auser => (def b (assoc a :age 40))#'user/buser => a{:name "kawasima" :age 39}
つまりコレクションに対する破壊的操作はできない
http://gotocon.com/dl/goto-cph-2012/slides/value-of-values.pdf
Sharing structure
http://hypirion.com/musings/understanding-persistent-vector-pt-1
コレクションに対して変更操作すると、新しいコレクションが返るが、変更のないデータは共有される。
※実際は7階層の32bitキーモデル
Managed refsそれでは実用的に使いにくいので、refsの仕組みがある。
:name "kawasima":age 40
person
person
Immutableなコレクションが新たに作られ、参照先が切り替わる
(def person (atom {:name "kawasima":age 39}))
(swap! person update-in [:age] inc)
@person
:name "kawasima":age 39
×
Epochal time model
person person
:age 39
:name "kawasima"
function
このモデルは、Append-onlyデータベースのDatomicでも採用されています。http://www.datomic.com/
Identity
Pure functions
:age 40
:name "kawasima"
加齢
Values
state state
Identity/State/Value
http://clojure.org/state
不変的で永続的なデータ構造
不変的に同一実体をさすもの
ある時点でのIdentityと結びついたValueの集合
Identity
State
Value
STM複数のrefsを一貫性をもって更新したい
http://www.atmarkit.co.jp/news/201008/11/lltiger.html
※ kawasimaはSTMあまり使わないので、@makingのスライドを拝借します。
core.async
イミュータビリティを基礎として作られた、CSP(Communicating Sequential Process)のライブラリ
http://github.com/clojure/core.async
スレッドプールからスレッドをとりだしthreadマクロに渡されたコードを実行する。channelからの呼び出し <!! のところでブロックする(future#getの状態)
core.async
thread-baseduser => (def ch (chan))#'user/chuser => (thread (println (<!! ch)))user => (>!! ch "hello")hello!nil
Javaでよくある並行処理と同じですね
core.async
coroutine-baseduser => (def ch (chan))#'user/chuser => (go (println (<! ch))) ;; (A)user => (go (>! ch "hello!"))hello!
goマクロによって、(A)の部分は、1. channelから値取り出す2. 1の値をprintlnに書き出すという2つのコードブロックに分割される。
core.async on ClojureScript
core.asyncはClojureScriptでも、Clojureと全く同じように動く。
ただ、Javascriptはシングルスレッドモデルなので、goのみ対応。
core.async のイケてるところ
これらが言語仕様に手を入れることなく、マクロだけで実装されていること。
go配下の構文を解析しブロック呼び出しの箇所で分割しそれぞれをステートとしたステートマシーンを構築しブロック中のスレッド使用効率をあげる
Get started
Clojure Java依存性 leiningen MavenIDE Lighttable
Emacs + ciderIntellij IDEANetBeans
LightTable: http://www.lighttable.comleiningen: http://leiningen.org/
Ring
tomcat
Rack
thin puma
Compojure Sinatra
hiccup enlive
jetty
Web developmentRubyと同じようなアーキテクチャスタック
Haml Erb
Grunt/Gulp layer
leiningenに統合されている● Aggregate/Minify -> lein cljsbuild auto
● ライブリロード -> lein figwheel
https://github.com/bhauman/lein-figwheel
ReactReactもClojurescriptから自在に扱える。(JSX不要)(defn container-view [{:keys [container non-parallel-actions]} owner {:keys [uses-parallelism?] :as opts}] (reify om/IRender (render [_] (let [container-id (container-model/id container) actions (remove :filler-action (map (fn [action] (get non-parallel-actions (:step action) action)) (:actions container)))] (html [:div.container-view {:style {:left (str (* 100 (:index container)) "%")} :id (str "container_" (:index container))} (om/build-all action actions {:key :step :opts opts})])))))
https://github.com/omcljs/om
Evidence development
clj-webdriverでブラウザ操作中(自動/手動対応)にスクリーンショットを取得し、Excel方眼紙のマス目ぴったりに貼り付けるソリューション
http://qiita.com/kawasima/items/41048cf3b998df4de37d