キメるClojure

1,008
-1

Published on

みんなでClojureをキメよう!

Published in: Software
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,008
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

キメるClojure

  1. 1. キメるClojure kawasima
  2. 2. Clojureとは何か どういう特長があるのか?
  3. 3. Clojureならではなこと… 文法 → Lisp方言 イミュータブルなデータ構造 → HaskellやScalaにもある 遅延評価 → その他多くの関数型言語と同じ CSP(core.async) → golangと同じ Future/Promise → JavaのFutureそのもの Almost nothing in Clojure is new (Clojure Appliedより)
  4. 4. 枯れた技術/概念を バランスよく配合した言語 ● Javaとの距離感 型をWrapせず、そのまま使う。 性能が気になるのであれば、Javaで書けばいいさ。 ● Lispとの距離感 ● 括弧の種類を増やす禁断の一手。だが程よく読みやすくなる。 Make reasoned choices (Clojure Appliedより)
  5. 5. ちょっと準備
  6. 6. Syntax Clojure Ruby String "Clojure" "Ruby" Keyword :clojure :ruby (Symbol) Numeric 123 (long) 123.0 (double) 22/7 (Ratio) 123 (Integer) 123.0 (Float) 22r/7 (Rational) List (1 2 3) - Vector [1 2 3] [1,2,3] (Array) Set #{1 2 3} Set[1, 2, 3] Map {:a 1 :b "a"} {a: 1, b: "a"} (Hash)
  7. 7. Clojure's S式の読み方 http://www.pixelmonkey.org/wordpress/wp-content/uploads/2014/11/clojure_syntax.png
  8. 8. はい、もう読めますねー
  9. 9. キメてみよう
  10. 10. Clojureはキメると気持ちイイ キマりやすいfeatureをご紹介していきます
  11. 11. Lazy Sequence Lispがキマりやすい 、 Fibonacci sequence (def fib (lazy-cat [0 1] (map + fib (rest fib)))) 再帰と遅延シーケンスの絶妙のハーモニー
  12. 12. こういうロジック fib 0,1,... (rest fib) 1,... fib 0,1,1.. (rest fib) 1,1,.. fib 0,1,1,2... (rest fib) 1,1,2,... fib 0,1,1,2,3... (rest fib) 1,1,2,3,.. fib 0,1,1,2,3,5... (rest fib) 1,1,2,3,5..
  13. 13. get-in 業務アプリ頻出の深いデータ構造を一発でアクセス (get-in ctx [:request :params :address 2 :prefecture]) => 東京都 {:request {:params {:address [{:prefecture "長崎県"} {:prefecture "大阪府"} {:prefecture "東京都"}]}}}
  14. 14. (update-in ctx [:request :params :address 2 :prefecture] clojure.string/replace #"府$" "都") {:request {:params {:address [{:prefecture "長崎県"} {:prefecture "大阪都"} {:prefecture "東京都"}]}}} update-in 業務アプリ頻出の深いデータ構造を一発で更新
  15. 15. そんなの他の言語でもできるよ =>ctx[:request][:params][:address][2][:prefecture]
  16. 16. =>ctx[:request][:params][:address][2][:prefecture] NoMethodError: undefined method `[]' for nil:NilClass from (irb):4 from /usr/bin/irb:11:in `<main>' user => (get-in ctx [:request :params :address 2 :prefecture]) nil ruby たどる途中でnilになっても、エラーにならない! Clojure
  17. 17. Multimethod データの型や値、属性によって、動的に呼ぶ関数を切り 替えるしくみ HTMLやXMLのパーサ書くときにも、タグや属性でキレ イに処理を分けられるので、キメキメに書ける。
  18. 18. Excelのパース
  19. 19. Threading Macro 関数の呼び出し順を、他の言語と同じようにしてくれる。 これだけでも十分、気持ちいいが… (.toUpperCase (str (first [:cat :dog :fish]))) (-> [:cat :dog :fish] first str .toUpperCase) ↑が↓のように書ける
  20. 20. "some" threading macro Optionalなんかなくても、やりたいことって、 nilが帰ってきたらそこで処理を抜けてくれることやろ?
  21. 21. promise/deliver Seleniumでパスワードはスクリプトに含めたくない。 ダイアログ開いてパスワード入力されたら、スクリプトを継続
  22. 22. Destructing String kanaSei = request.getParamter("KANA_SEI"); String kanaMei = request.getParamter("KANA_MEI"); String kanjiSei = request.getParamter("KANJI_SEI"); String kanjiMei = request.getParamter("KANJI_MEI"); String mailUser = request.getParameter("MAIL_USER"); String mailDomain = request.getParameter("MAIL_DOMAIN"); (let [{{:keys [kana-sei kana-mei kanji-sei kanji-mei mail-user mail-domain]} :params} request] (println "Name=" kanji-sei kanji-mei)) こんなコード、よく見かけるけど… そんな代入派も、最小の手数で変数束縛できる
  23. 23. 複雑な構造も一発で、束縛できる デフォルト値もセットできる
  24. 24. はい、キマってきましたね
  25. 25. Clojureのライブラリも キマっている
  26. 26. Ring (-> handler (wrap wrap-anti-forgery (get-in config [:security :anti-forgery] false)) (wrap wrap-flash (get-in config [:session :flash] false)) (wrap wrap-session (:session config false)) (wrap wrap-keyword-params (get-in config [:params :keywordize] false)) (wrap wrap-nested-params (get-in config [:params :nested] false)) (wrap wrap-multipart-params (get-in config [:params :multipart] false)) (wrap wrap-params (get-in config [:params :urlencoded] false)) (wrap wrap-cookies (get-in config [:cookies] false)) (wrap wrap-absolute-redirects (get-in config [:responses :absolute-redirects] false)) (wrap wrap-resource (get-in config [:static :resources] false)) (wrap wrap-file (get-in config [:static :files] false)) (wrap wrap-content-type (get-in config [:responses :content-types] false)) (wrap wrap-default-charset (get-in config [:responses :default-charset] false)) (wrap wrap-not-modified (get-in config [:responses :not-modified-responses] false)) (wrap wrap-x-headers (:security config)) (wrap wrap-hsts (get-in config [:security :hsts] false)) (wrap wrap-ssl-redirect (get-in config [:security :ssl-redirect] false)) (wrap wrap-forwarded-scheme (boolean (:proxy config))) (wrap wrap-forwarded-remote-addr (boolean (:proxy config))))) 統一されたMiddlewareインタフェース
  27. 27. Compojure 2000行のスモールフレームワークSinatraに対し、 Compojureは500行以下 (ringもweavejester先生が設計してることが大きい) (defroutes api-routes (ANY "/token" [] token-resource) (ANY "/boards" [] boards-resource) (ANY "/board/:board-name" [board-name] (board-resource board-name)) (ANY "/board/:board-name/threads" [board-name] (threads-resource board-name)) (ANY "/thread/:thread-id" [thread-id] (thread-resource (Long/parseLong thread-id))) (ANY "/thread/:thread-id/comments" [thread-id] (comments-resource (Long/parseLong thread-id) 1 nil))) 宣言的にルーティングを書ける。
  28. 28. core.async goのchannlと同じものを簡単に使える http://www.slideshare.net/kawasima/shibuya-jvm-1clojure core.asyncのデザインの素晴らしさは拙作スライドをご覧ください
  29. 29. Liberator REST APIを宣言的に書ける HTTPステータスコードマニアには たまらない
  30. 30. buddy 認証・認可のしくみも美しい API用認証を付け足すのもシンプル
  31. 31. デファクトスタンダードのライブラリが、 ことごとく ➔ 洗練されたデザイン ➔ 小さくて読みやすい ➔ 比較的、仕様が安定している
  32. 32. まとめ
  33. 33. Clojureをキメると気持ちイイ 質の高いライブラリ群はさらに気持ちイイ
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×