Post on 07-Aug-2015
数字で見る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を参照のこと
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の高速化‣ 以下の関数が、IReduceを実装した固有のシーケンスを返すようになった
‣ repeat ‣ cycle ‣ iterate ‣ range ‣ keys ‣ vals ‣ iterator-seq
aproposの表示改善‣ 結果が名前空間修飾されて返ってくるように
‣ 各シンボルがどの名前空間に含まれるか識別可能
user=> (apropos #”^replace$”) ;; ~1.6(replace replace replace …)
user=> (apropos #”^replace$”) ;; 1.7~(clojure.core/replace clojure.string/replace clojure.zip/replace …)user=>
関数名のマングリングルール修正‣ 関数に対応するクラスを生成する際の、マングリングされた名前が衝突するのを修正
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