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