Your SlideShare is downloading. ×
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

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

204
views

Published on

Clojure

Clojure

Published in: Software

0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
204
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
4
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. ImmutableImmutable時代のプログラミング言語時代のプログラミング言語 ClojureClojure kawasima 渋谷JVM(言語)
  • 2. 特長 ● Lisp ● 関数型プログラミングのためのもの ● 確固たるプラットフォームと共生する JVM, .NET, Javascript上でそれらの型,GC,例外機構を利用し ながら動作する ● Concurrencyのためにデザインされた http://clojure.org/rationale
  • 3. Lispの話は特にしません
  • 4. Conceptualなところが おもしろい https://github.com/matthiasn/talk-transcripts その中から特徴的なものをご紹介しますその中から特徴的なものをご紹介します
  • 5. Simple made easy Clojureにおける (というよりRich Hickeyの?) シンプルさ、の考え方 http://www.infoq.com/presentations/Simple-Made-Easy
  • 6. Simple ● ひとつの役割 ● ひとつのタスク ● ひとつの概念 ● ひとつの次元 ひとつといっても、 これはシンプルじゃない ● ひとつのインスタンス ● ひとつの操作 対義語: Complex
  • 7. Easy ● 必要なことがすぐに実現できること ● IDE ● Apt-get, gem install ● 馴染みがあること 対義語: Hard
  • 8. 複雑 シンプル 状態、オブジェクト状態、オブジェクト 値値 メソッドメソッド 関数、ネームスペース関数、ネームスペース varvar Managed refsManaged refs 継承、マッチング継承、マッチング ポリモーフィズムポリモーフィズム 文法文法 データデータ 命令的なループ命令的なループ 集合関数集合関数 アクターアクター キューキュー ORMORM 宣言的なデータ操作宣言的なデータ操作 条件条件 ルールルール Complex or Simple
  • 9. 複雑 構成物 状態 触るものみな複雑 オブジェクト 状態、アイデンティティ、値 メソッド 関数、状態、ネームスペース 文法 意味と順序 命令的なループ 集合関数 アクター What / Who 条件 複数のルール 複雑さのもとは組み合わせ
  • 10. シンプルなもの 実現方法 値 Final,永続的なコレクション 関数 ステートレスなメソッド ネームスーペース 言語のサポート データ Maps,Arrays,SetsやJSON,XML ポリモーフィズム プロトコル、型クラス Managed refs ClojureやHaskellのrefs ルール ライブラリ、Prolog シンプルさのツールボックス
  • 11. 10のデータ構造それぞれに 10の関数操作があるよりも、 1つのデータ構造に 100の関数操作がある方がよい Alan J. Perils http://www.cs.yale.edu/homes/perlis-alan/quotes.html Abstraction
  • 12. seq function http://clojure.org/sequences
  • 13. seq http://www.slideshare.net/alexmiller/clojure-the-art-of-abstraction-7161663/40 ● String ● Java collection ● Java iterator ● ResultSet ● XML ● ファイルの行
  • 14. Concurrency Clojureを使いたくなる本を ご紹介しておきます。 https://pragprog.com/book/pb7con/seven-concurrency-models-in-seven-weeks
  • 15. 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
  • 16. Sharing structure http://hypirion.com/musings/understanding-persistent-vector-pt-1 コレクションに対して変 更操作すると、新しい コレクションが返るが、 変更のないデータは共 有される。 ※実際は7階層の32bitキーモデル
  • 17. 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 ×
  • 18. 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
  • 19. Identity/State/Value http://clojure.org/state 不変的で永続的なデータ構造 不変的に同一実体をさすもの ある時点でのIdentityと結びついた Valueの集合 Identity State Value
  • 20. STM 複数のrefsを一貫性をもって更新したい http://www.atmarkit.co.jp/news/201008/11/lltiger.html ※ kawasimaはSTMあまり使わないので、@makingのスライドを拝借します。
  • 21. core.async イミュータビリティを基礎として作られた、 CSP(Communicating Sequential Process)のライブラリ http://github.com/clojure/core.async
  • 22. go CSP channel https://www.youtube.com/watch?v=msv8Fvtd6YQ go thread thread >! <! >!! <!!
  • 23. core.async thread-based BlockedBlocked 一つの処理は一つのスレッドで。 チャネルの入出力でブロックされる。 並列性があがると多くのスレッドを要求する。
  • 24. スレッドプールからスレッドをとりだし threadマクロに渡されたコードを実行する。 channelからの呼び出し <!! のところでブロックする (future#getの状態) core.async thread-based user => (def ch (chan)) #'user/ch user => (thread (println (<!! ch))) user => (>!! ch "hello") hello! nil Javaでよくある並行処理と同じですね
  • 25. core.async coroutine-based ブロック地点でpark状態にし、スレッドをプールに戻す。 メリット: 少ないスレッドで並行処理ができる
  • 26. 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つのコードブロックに分割される。
  • 27. core.async on ClojureScript core.asyncはClojureScriptでも、Clojureと全く同 じように動く。 ただ、Javascriptはシングルスレッドモデルなの で、goのみ対応。
  • 28. core.async のイケてるところ これらが言語仕様に手を入れることなく、 マクロだけで実装されていること。 go配下の構文を解析し ブロック呼び出しの箇所で分割し それぞれをステートとしたステートマシーンを構築し ブロック中のスレッド使用効率をあげる
  • 29. マクロすげぇマクロすげぇ 世の中世の中LispLispで支配するのだ!で支配するのだ! LispLispは宇宙だは宇宙だ ((。∀ ゜。∀ ゜))
  • 30. Clojureをはじめてみよう! すみません…取り乱しました… http://practical-scheme.net/trans/icadmore-j.html
  • 31. Get started Clojure Java 依存性 leiningen Maven IDE Lighttable Emacs + cider Intellij IDEA NetBeans LightTable: http://www.lighttable.com leiningen: http://leiningen.org/
  • 32. Self-study http://www.4clojure.com
  • 33. Ring tomcat Rack thin puma Compojure Sinatra hiccup enlive jetty Web development Rubyと同じようなアーキテクチャスタック Haml Erb
  • 34. Clojurescript Google Closure Compilerを使ってJavascriptに 変換される。 すでに実用段階 ● Circle CI ● MailOnline ● eBay
  • 35. Grunt/Gulp layer leiningenに統合されている ● Aggregate/Minify -> lein cljsbuild auto ● ライブリロード -> lein figwheel https://github.com/bhauman/lein-figwheel
  • 36. 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
  • 37. Excel development http://github.com/kawasima/axebomber-clj HTMLライクな記述でExcel方眼紙が出力できる!
  • 38. Evidence development clj-webdriverでブラウザ操作中(自動/手動対応) にスクリーンショットを取得し、Excel方眼紙のマス 目ぴったりに貼り付けるソリューション http://qiita.com/kawasima/items/41048cf3b998df4de37d
  • 39. Job development http://github.com/kawasima/job-streamer
  • 40. あなたと! Clojure! 今すぐ! イミュータブル!