SlideShare a Scribd company logo
キメるClojure
kawasima
Clojureとは何か
どういう特長があるのか?
Clojureならではなこと…
文法 → Lisp方言
イミュータブルなデータ構造 → HaskellやScalaにもある
遅延評価 → その他多くの関数型言語と同じ
CSP(core.async) → golangと同じ
Future/Promise → JavaのFutureそのもの
Almost nothing in Clojure is new
(Clojure Appliedより)
枯れた技術/概念を
バランスよく配合した言語
●
Javaとの距離感
型をWrapせず、そのまま使う。
性能が気になるのであれば、Javaで書けばいいさ。
●
Lispとの距離感
●
括弧の種類を増やす禁断の一手。だが程よく読みやすくなる。
Make reasoned choices
(Clojure Appliedより)
ちょっと準備
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)
Clojure's S式の読み方
http://www.pixelmonkey.org/wordpress/wp-content/uploads/2014/11/clojure_syntax.png
はい、もう読めますねー
キメてみよう
Clojureはキメると気持ちイイ
キマりやすいfeatureをご紹介していきます
Lazy Sequence
Lispがキマりやすい 、 Fibonacci sequence
(def fib
(lazy-cat [0 1]
(map + fib (rest fib))))
再帰と遅延シーケンスの絶妙のハーモニー
こういうロジック
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..
get-in
業務アプリ頻出の深いデータ構造を一発でアクセス
(get-in ctx [:request :params
:address 2 :prefecture])
=> 東京都
{:request
{:params
{:address
[{:prefecture "長崎県"}
{:prefecture "大阪府"}
{:prefecture "東京都"}]}}}
(update-in ctx [:request :params
:address 2 :prefecture]
clojure.string/replace
#"府$" "都")
{:request
{:params
{:address
[{:prefecture "長崎県"}
{:prefecture "大阪都"}
{:prefecture "東京都"}]}}}
update-in
業務アプリ頻出の深いデータ構造を一発で更新
そんなの他の言語でもできるよ
=>ctx[:request][:params][:address][2][:prefecture]
=>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
Multimethod
データの型や値、属性によって、動的に呼ぶ関数を切り
替えるしくみ
HTMLやXMLのパーサ書くときにも、タグや属性でキレ
イに処理を分けられるので、キメキメに書ける。
Excelのパース
Threading Macro
関数の呼び出し順を、他の言語と同じようにしてくれる。
これだけでも十分、気持ちいいが…
(.toUpperCase (str (first [:cat :dog :fish])))
(-> [:cat :dog :fish] first str .toUpperCase)
↑が↓のように書ける
"some" threading macro
Optionalなんかなくても、やりたいことって、
nilが帰ってきたらそこで処理を抜けてくれることやろ?
promise/deliver
Seleniumでパスワードはスクリプトに含めたくない。
ダイアログ開いてパスワード入力されたら、スクリプトを継続
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))
こんなコード、よく見かけるけど…
そんな代入派も、最小の手数で変数束縛できる
複雑な構造も一発で、束縛できる
デフォルト値もセットできる
はい、キマってきましたね
Clojureのライブラリも
キマっている
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インタフェース
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)))
宣言的にルーティングを書ける。
core.async
goのchannlと同じものを簡単に使える
http://www.slideshare.net/kawasima/shibuya-jvm-1clojure
core.asyncのデザインの素晴らしさは拙作スライドをご覧ください
Liberator
REST APIを宣言的に書ける
HTTPステータスコードマニアには
たまらない
buddy
認証・認可のしくみも美しい
API用認証を付け足すのもシンプル
デファクトスタンダードのライブラリが、
ことごとく
➔
洗練されたデザイン
➔
小さくて読みやすい
➔
比較的、仕様が安定している
まとめ
Clojureをキメると気持ちイイ
質の高いライブラリ群はさらに気持ちイイ

More Related Content

PDF
関数型プログラミングのデザインパターンひとめぐり
KEY
やはりお前らのMVCは間違っている
PDF
ストリーム処理を支えるキューイングシステムの選び方
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
PDF
モジュールの凝集度・結合度・インタフェース
PDF
40歳過ぎてもエンジニアでいるためにやっていること
PDF
Pythonによる黒魔術入門
PPTX
非同期処理の基礎
関数型プログラミングのデザインパターンひとめぐり
やはりお前らのMVCは間違っている
ストリーム処理を支えるキューイングシステムの選び方
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
モジュールの凝集度・結合度・インタフェース
40歳過ぎてもエンジニアでいるためにやっていること
Pythonによる黒魔術入門
非同期処理の基礎

What's hot (20)

PDF
オブジェクト指向できていますか?
PDF
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
PDF
強いて言えば「集約どう実装するのかな、を考える」な話
PDF
Dockerからcontainerdへの移行
PPT
Glibc malloc internal
PDF
テストとリファクタリングに関する深い方法論 #wewlc_jp
PDF
できる!並列・並行プログラミング
PDF
テスト文字列に「うんこ」と入れるな
PDF
日本語テストメソッドについて
PDF
並行処理初心者のためのAkka入門
PPTX
さくっと理解するSpring bootの仕組み
PDF
大規模グラフ解析のための乱択スケッチ技法
PDF
実環境にTerraform導入したら驚いた
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
PDF
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
PDF
Docker Compose 徹底解説
PPTX
契約プログラミング
PDF
会社でClojure使ってみて分かったこと
PDF
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
オブジェクト指向できていますか?
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
強いて言えば「集約どう実装するのかな、を考える」な話
Dockerからcontainerdへの移行
Glibc malloc internal
テストとリファクタリングに関する深い方法論 #wewlc_jp
できる!並列・並行プログラミング
テスト文字列に「うんこ」と入れるな
日本語テストメソッドについて
並行処理初心者のためのAkka入門
さくっと理解するSpring bootの仕組み
大規模グラフ解析のための乱択スケッチ技法
実環境にTerraform導入したら驚いた
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Docker Compose 徹底解説
契約プログラミング
会社でClojure使ってみて分かったこと
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
Ad

Viewers also liked (20)

PDF
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
PDF
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
PDF
JobStreamerではじめるJavaBatchのクラウド分散実行
PDF
たとえ日本人同士でも必要な異文化理解力
PDF
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
PDF
既婚プログラマの時間捻出術
PDF
Antifragile Clojure
PDF
週刊Webサイトのアーキテクチャ
PDF
SIerにとっての越境 @ DevLOVE 199
PDF
で、次は何がくるの? - 第2回 TIS Matsuri
PDF
Boilerplate vs Magic
PDF
Seasar conference 2015 sa-compojure
PDF
元気玉的 分散テスト 実行システム TestStreamer
PDF
なぜデータモデリングが重要なのか?
PDF
イミュータブルデータモデル(世代編)
PDF
イマドキのExcelスクショの撮り方
PDF
イミュータブルデータモデル(入門編)
PDF
プログラミング言語Clojureのニャンパスでの活用事例
KEY
Clojure入門
PDF
Clojureによるログ収集と解析
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
JobStreamerではじめるJavaBatchのクラウド分散実行
たとえ日本人同士でも必要な異文化理解力
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
既婚プログラマの時間捻出術
Antifragile Clojure
週刊Webサイトのアーキテクチャ
SIerにとっての越境 @ DevLOVE 199
で、次は何がくるの? - 第2回 TIS Matsuri
Boilerplate vs Magic
Seasar conference 2015 sa-compojure
元気玉的 分散テスト 実行システム TestStreamer
なぜデータモデリングが重要なのか?
イミュータブルデータモデル(世代編)
イマドキのExcelスクショの撮り方
イミュータブルデータモデル(入門編)
プログラミング言語Clojureのニャンパスでの活用事例
Clojure入門
Clojureによるログ収集と解析
Ad

Similar to キメるClojure (20)

PDF
From Java To Clojure
PDF
モダンJavaScript環境構築一歩目
PDF
イマドキの現場で使えるJavaライブラリ事情
PDF
Re-frame and A-Frame
PDF
ATN No.2 Scala事始め
PDF
Clojure
KEY
Aizu lt tokyo_luxion
PDF
Clojureで作る"simple"なDSL
PDF
Lisp Tutorial for Pythonista : Day 4
KEY
Clojureの発表など
PDF
MoteMote Compiler Plugin
PDF
第一回社内 Scala 勉強会(一部抜粋)
PDF
Kanazawa.js.Next
PPT
Scala on Hadoop
PDF
Java8から17へ
PDF
Groovyで楽にSQLを実行してみよう
KEY
関ジャバ JavaOne Tokyo 2012報告会
PDF
JavaScriptユーティリティライブラリの紹介
PDF
Shibuya.lisp #28: 仮題: R について
PDF
TypeScript 言語処理系ことはじめ
From Java To Clojure
モダンJavaScript環境構築一歩目
イマドキの現場で使えるJavaライブラリ事情
Re-frame and A-Frame
ATN No.2 Scala事始め
Clojure
Aizu lt tokyo_luxion
Clojureで作る"simple"なDSL
Lisp Tutorial for Pythonista : Day 4
Clojureの発表など
MoteMote Compiler Plugin
第一回社内 Scala 勉強会(一部抜粋)
Kanazawa.js.Next
Scala on Hadoop
Java8から17へ
Groovyで楽にSQLを実行してみよう
関ジャバ JavaOne Tokyo 2012報告会
JavaScriptユーティリティライブラリの紹介
Shibuya.lisp #28: 仮題: R について
TypeScript 言語処理系ことはじめ

More from Yoshitaka Kawashima (18)

PDF
Grokking Simplicity探訪
PDF
ブルックスのいう銀の弾丸とは何か?
PDF
Are Design Patterns Dead?
PDF
ソフトウェアにおける 複雑さとは何なのか?
PDF
Tackling Complexity
PDF
イミュータブルデータモデルの極意
PDF
ソフトウェア開発における『知の高速道路』
PDF
ソフトウェア設計における 意思決定とそのレビューの秘訣
PDF
本番障害に至る病
PDF
システムダウンのひみつ
PDF
Mavenの真実とウソ
PDF
アンチフラジャイルの世界
PDF
Atomic Architecture
PDF
それはYAGNIか? それとも思考停止か?
PDF
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
PDF
ウォーターフォールとアジャイルのフェアな比較
PDF
How to find tech books
PDF
Antifragile Java - Java Day Tokyo 2017 D1-E1
Grokking Simplicity探訪
ブルックスのいう銀の弾丸とは何か?
Are Design Patterns Dead?
ソフトウェアにおける 複雑さとは何なのか?
Tackling Complexity
イミュータブルデータモデルの極意
ソフトウェア開発における『知の高速道路』
ソフトウェア設計における 意思決定とそのレビューの秘訣
本番障害に至る病
システムダウンのひみつ
Mavenの真実とウソ
アンチフラジャイルの世界
Atomic Architecture
それはYAGNIか? それとも思考停止か?
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
ウォーターフォールとアジャイルのフェアな比較
How to find tech books
Antifragile Java - Java Day Tokyo 2017 D1-E1

キメるClojure