Fork me on GitHub
#clojure-japan
<
2015-06-18
>
kara_d00:06:07

update関数は、kormaを使っている人は地味に面倒な問題となってますね。

kara_d00:06:41

(:refer-clojure :exclude [update])をしないといけないという。

ayato_p00:06:50

結構汎用的な名前だけにいたるところで衝突起こってますよね

ayato_p00:06:39

へーしゃのプロジェクト内でもやっぱり普通に update という名前の関数があったりするので、 1.7 に上げたときに結構コンフリクトしました

kara_d00:06:48

まあ、:requireと:asをつかえばライブラリ読み込みの場合は問題はなくなるんですが、DSLちっくに使うkormaみたいなのだとnsごとにいちいちexcludeするという感じでいまは対応しています。ns内にupdate関数があったりするとやっかいですね。

icalo3500:06:09

へぇー、ぐらいの感じで流してたんですが、確かにそういう意味ではインパクト大きい変更ですね。SQLめいた操作なんてみんな書いてたでしょうし>update

kara_d00:06:41

ちんまりと増えたrun!関数ですが、こんな感じで実行結果がちがいました

kara_d00:06:54

;;普通のprintln

d.core=> (println (range 10))
(0 1 2 3 4 5 6 7 8 9)
nil

;;runつかったものprintln

d.core=> (run! println (range 10))
0
1
2
3
4
5
6
7
8
9
nil

;; mapだとこう

d.core=> (map println (range 10))
0
1
2
3
4
5
6
7
8
9
(nil nil nil nil nil nil nil nil nil nil)

athos00:06:03

updateの件については、こういうときのために名前が衝突した場合に警告が出るようになってるので、lein checkをすれば修正すべき箇所は網羅できますね。修正自体は面倒ですけど。

athos00:06:13

run!は同じことをいちいち (dorun (map println (range 10))) でやってたりしたので、あればあったで便利かな

athos00:06:57

(doc run!) してドッグランを思い浮かべたのは内緒

icalo3501:06:19

changesのrun! のとこ "via reduce"ってありますし、定義覗いたら(reduce #(proc %2) nil coll)ってなってるんですけど(dorun(map proc coll))みたいな感じではないんですね。

athos01:06:28

"via reduce”というところを強調する真意は分かりませんが、reduce経由だとseqableでなくてもIReduceを実装していれば処理できるというのもありますし、reduceはパフォーマンスについてもかなり考慮されてるんでおそらくそのあたりが理由ですかね。

athos01:06:13

user=> (run! println (reify clojure.lang.IReduce (reduce [this f x] (f x 42))))
42
nil 

athos03:06:42

run!のdocstringに “Returns nil” と書いてあるけど、 (run! reduced (range)) ;=> 0 なのは意図した振る舞いなのかバグなのか…

ayato_p04:06:42

実は nil だけじゃないよ!みたいな。使うときは nil が返ってくると思って返り値のことは気にしないでね!ってことじゃないですか?(適当なこじつけ

athos04:06:12

うーん、「戻り値は使うな」みたいな関数はあるかも、という気はしますけど、そういうときにあえて “returns nil” と明言はしないような

ayato_p04:06:49

いや、まぁ適当なこと言ってるので、気にしないでくださいw

athos04:06:12

一応、#clojure-dev で聞いてみたら他の人が早々とチケットを作ってくれてしまった

ayato_p04:06:03

お、良いですね 👏