ImmutableImmutable時代のプログラミング言語時代のプログラミング言語
ClojureClojure
kawasima
渋谷JVM(言語)
特長
● Lisp
● 関数型プログラミングのためのもの
● 確固たるプラットフォームと共生する
JVM, .NET, Javascript上でそれらの型,GC,例外機構を利用し
ながら動作する
● Concurrencyのためにデザインされた
http://clojure.org/rationale
Lispの話は特にしません
Conceptualなところが
おもしろい
https://github.com/matthiasn/talk-transcripts
その中から特徴的なものをご紹介しますその中から特徴的なものをご紹介します
Simple made easy
Clojureにおける
(というよりRich Hickeyの?)
シンプルさ、の考え方
http://www.infoq.com/presentations/Simple-Made-Easy
Simple
● ひとつの役割
● ひとつのタスク
● ひとつの概念
● ひとつの次元
ひとつといっても、
これはシンプルじゃない
● ひとつのインスタンス
● ひとつの操作
対義語: Complex
Easy
● 必要なことがすぐに実現できること
●
IDE
● Apt-get, gem install
● 馴染みがあること
対義語: Hard
複雑 シンプル
状態、オブジェクト状態、オブジェクト 値値
メソッドメソッド 関数、ネームスペース関数、ネームスペース
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 function
http://clojure.org/sequences
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/a
user => (def b (assoc a :age 40))
#'user/b
user => 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
go
CSP
channel
https://www.youtube.com/watch?v=msv8Fvtd6YQ
go
thread thread
>! <!
>!! <!!
core.async
thread-based
BlockedBlocked
一つの処理は一つのスレッドで。
チャネルの入出力でブロックされる。
並列性があがると多くのスレッドを要求する。
スレッドプールからスレッドをとりだし
threadマクロに渡されたコードを実行する。
channelからの呼び出し <!! のところでブロックする
(future#getの状態)
core.async
thread-based
user => (def ch (chan))
#'user/ch
user => (thread (println (<!! ch)))
user => (>!! ch "hello")
hello!
nil
Javaでよくある並行処理と同じですね
core.async
coroutine-based
ブロック地点でpark状態にし、スレッドをプールに戻す。
メリット: 少ないスレッドで並行処理ができる
core.async
coroutine-based
user => (def ch (chan))
#'user/ch
user => (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配下の構文を解析し
ブロック呼び出しの箇所で分割し
それぞれをステートとしたステートマシーンを構築し
ブロック中のスレッド使用効率をあげる
マクロすげぇマクロすげぇ
世の中世の中LispLispで支配するのだ!で支配するのだ!
LispLispは宇宙だは宇宙だ
((。∀ ゜。∀ ゜))
Clojureをはじめてみよう!
すみません…取り乱しました…
http://practical-scheme.net/trans/icadmore-j.html
Get started
Clojure Java
依存性 leiningen Maven
IDE Lighttable
Emacs + cider
Intellij IDEA
NetBeans
LightTable: http://www.lighttable.com
leiningen: http://leiningen.org/
Self-study
http://www.4clojure.com
Ring
tomcat
Rack
thin puma
Compojure Sinatra
hiccup enlive
jetty
Web development
Rubyと同じようなアーキテクチャスタック
Haml Erb
Clojurescript
Google Closure Compilerを使ってJavascriptに
変換される。
すでに実用段階
● Circle CI
●
MailOnline
● eBay
Grunt/Gulp layer
leiningenに統合されている
●
Aggregate/Minify -> lein cljsbuild auto
●
ライブリロード -> lein figwheel
https://github.com/bhauman/lein-figwheel
React
Reactも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
Excel development
http://github.com/kawasima/axebomber-clj
HTMLライクな記述でExcel方眼紙が出力できる!
Evidence development
clj-webdriverでブラウザ操作中(自動/手動対応)
にスクリーンショットを取得し、Excel方眼紙のマス
目ぴったりに貼り付けるソリューション
http://qiita.com/kawasima/items/41048cf3b998df4de37d
Job development
http://github.com/kawasima/job-streamer
あなたと!
Clojure!
今すぐ!
イミュータブル!

渋谷JVM#1 Immutable時代のプログラミング言語 Clojure