16
Clojure Language Update Clojure 1.7勉強会 2015/06/27 @HaLake @athos0220

Clojure Language Update (2015)

  • Upload
    sohta

  • View
    526

  • Download
    1

Embed Size (px)

Citation preview

 Clojure Language Update

Clojure 1.7勉強会 2015/06/27 @HaLake

@athos0220

数字で見るClojure 1.7‣ 開発期間:2014/5/25~ (2014/8/6 alpha1リリース)

‣ チケット数:116 /570

‣ コミット数:159 /2756

‣ コミッター:30人 /130

‣ コード行数 - *.java:58067行 (+3582, -1011) -  *.clj:32488行 (+2530, -1296) 数値は2015/6/25現在のもの

Clojure 1.7 変更点 概観‣ Transducers (詳細は@athos0220の発表) 対象となるデータ構造に依存しない、各要素の変換アルゴリズムの記述方法

‣ Reader Conditionals (詳細は@_ayato_pさんの発表) Clojure/ClojureScript/ClojureCLR間での相互運用性向上のための仕組み

‣ その他新機能

‣ パフォーマンス向上

‣ 機能向上変更点の詳細・一覧についてはChangeLogを参照のこと

その他新機能‣ :warn-boxed-math

‣ REPLでのデータの表示方法

‣ update関数

‣ run!関数

‣ volatile

‣ etc.

update関数‣ update-inのネストしない版

user=> (def m {:a 0})#’user/muser=> (update m :a inc){:a 1};; これまでは下のようにする必要があったuser=> (update-in m [:a] inc){:a 1}user=>

run!関数‣ (run! proc s) = (reduce #(proc %2) nil s)

‣ シーケンスの各要素に副作用を起こすときに便利

user=> (run! println (range 3))012niluser=>

volatile‣ Atomより効率のよい破壊的変更を実現する

‣ stateful transducerを書くために導入された

user=> (def v (volatile! 0))#’user/vuser=> (vreset! v 42)42user=> (vswap! v inc)43user=> @v43

REPLでのデータの表示方法‣ 表示方法が定義されていないオブジェクトをタグ付きリテラルとして表示

‣ nREPLなどで評価結果を受け渡すのが便利に

user=> *ns*#object[clojure.lang.Namespace 0x13823a1f “user”]user=> (defn f [x])#’user/fuser=> f#object[user$f 0x2b65f534 “user$f@2b65f534”]user=>

:warn-on-boxed‣ 数値演算がプリミティブ型でなくボクシングされた型で行なわれたときに警告を出す

user=> (defn f [x] (+ x 2))#’user/fuser=> (set! *unchecked-math* :warn-on-boxed)trueuser=> (defn f’ [x] (+ x 2))Boxed math warning, NO_SOURCE_PATH:10:18 …user=> (defn f’’ [^long x] (+ x 2))#’user/f’’

パフォーマンス向上‣ reduceの高速化

‣ キーワード・シンボルのインターン

‣ Multimethodのキャッシュ

‣ vec/setの高速化

‣ etc. etc.

reduceの高速化‣ 以下の関数が、IReduceを実装した固有のシーケンスを返すようになった

‣ repeat ‣ cycle ‣ iterate ‣ range ‣ keys ‣ vals ‣ iterator-seq

機能向上

‣ aproposの表示改善

‣ IAtomインタフェースの分離

‣ 関数クラスのマングリングルール修正

‣ etc. etc.

aproposの表示改善‣ 結果が名前空間修飾されて返ってくるように

‣ 各シンボルがどの名前空間に含まれるか識別可能

user=> (apropos #”^replace$”) ;; ~1.6(replace replace replace …)

user=> (apropos #”^replace$”) ;; 1.7~(clojure.core/replace clojure.string/replace clojure.zip/replace …)user=>

IAtomインタフェースの分離

‣ アトミックな値更新操作をIAtomインタフェースとしてAtomから分離

‣ ユーザ定義型でもreset!/swap!などが使えるように

関数名のマングリングルール修正‣ 関数に対応するクラスを生成する際の、マングリングされた名前が衝突するのを修正

code before after(defn a []) user$a user$a(fn []) user$evalN$fn__N user$evalN$fn__N(fn a []) user$evalN$a__N user$evalN$a__N(let [a (fn [])] a) user$evalN$a__N user$evalN$a__N(let [a (fn x [])] a) user$evalN$x__N user$evalN$a_x_N(def a (fn [])) user$a user$a(def a (fn x [])) user$x user$a_x_N(def ^{:foo (fn [])} a) user$fn__N user$fn__N(def ^{:foo (fn a [])} a) user$a user$a__N(def a (fn [] (fn []))) user$a$fn__N user$a$fn__N(def a (fn [] (fn x []))) user$a$x__N user$a$x__N

まとめ

‣ Clojure 1.7はさまざま環境でのコードの再利用性を向上させる試みが取り入れられたリリース

‣ ClojureScriptやcore.asyncなどとの協調がさらに便利になっていくかも?