clojure-japan

2015-06-18T00:01:07.000457Z

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

2015-06-18T00:01:41.000458Z

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

ayato_p 2015-06-18T00:01:50.000459Z

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

ayato_p 2015-06-18T00:02:39.000460Z

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

2015-06-18T00:04:48.000461Z

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

icalo35 2015-06-18T00:25:09.000462Z

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

2015-06-18T00:30:41.000463Z

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

2015-06-18T00:30:54.000464Z

;;普通の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)

athos 2015-06-18T00:53:03.000465Z

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

athos 2015-06-18T00:54:13.000466Z

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

athos 2015-06-18T00:54:57.000467Z

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

ayato_p 2015-06-18T01:02:30.000468Z

😆

icalo35 2015-06-18T01:32:19.000469Z

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

athos 2015-06-18T01:50:28.000470Z

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

athos 2015-06-18T01:53:13.000471Z

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

athos 2015-06-18T03:30:42.000473Z

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

ayato_p 2015-06-18T04:08:42.000474Z

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

athos 2015-06-18T04:12:12.000475Z

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

ayato_p 2015-06-18T04:12:49.000476Z

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

athos 2015-06-18T04:14:12.000477Z

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

ayato_p 2015-06-18T04:16:03.000478Z

お、良いですね 👏