Clojureおじさん
Clojureおじさん
サイバーエージント新卒
第5回 Fresh勉強会
About Me
- κeen
- @blackenedgold
- Github: KeenS
- 渋谷のエンジニア
- Lisp, ML, Shell Scriptあたりを書きます
Clojure
- 2007年から
- JVMで動くLisp系言語
- 函数型
- 動的型付き
- 値は基本immutable
- 遅延シーケンス
- STMがあり、並列処理に強い
Hello World
(println "Hello, World")
JVM
Javaのコードをシームレスに呼べる
obj.method()
ではなく(.method obj)
Class.staticField
ではなくClass/staticField
obj.method1().method2()
ではなく(.. obj method1 method2)
JVM
(.println System/out "Hello JVM")
(Math/random)
Immutable
- 状態を持たないのでコードの見通しが良い
- 並列で考える時には重要
- 複雑さだけでなく不整合などバグの原因になりやすい
- 変更可能な値もある
- それらはトランザクション内でのみ変更可能
- 不整合が起きない
函数型
(filter odd? (map #(+ 1 %) '(1 2 3)))
遅延シーケンス
(def natural_number (iterate inc 1))
(take 5 natural_number) ;=> (1 2 3 4 5)
リスト内包表記
(for [x (range 5)] (* x x))
;=> (1 4 9 16 25)
#並列処理に強い
- 簡単にはJavaのスレッドを呼べばいい
- Clojureの関数は全てCallableでRunnablea
(.start (Thread. (fn []
(Thread/sleep 1000)
(println 'foo))))
#並列処理に強い
core.async
- goroutineとgochannelが使える
core.async
(require '[clojure.core.async :as async :refer :all])
(let [c (chan)]
(go (>! c "hello"))
(assert (= "hello" (<!! (go (<! c)))))
(close! c))
(require '[clojure.core.async :as async :refer :all])
(let [c (chan)]
(thread (>!! c "hello"))
(assert (= "hello" (<!! c)))
(close! c))
今回紹介し切れなかったの
- マクロ
- メタデータ
- protocolとかの多態性
- ClojureScript/Om
- Typed Clojure
まとめ
- Clojureを使えばJavaが使える
- Clojureを使えばPythonのリスト内包表記が使える
- Clojureを使えばGoのgoroutine/gochannelが使える
Why not start Clojure?
Clojureおじさん
サイバーエージント新卒第5回 Fresh勉強会