Clojure > Archives > 2016/07/28

2016/07/28 13:08:13 UTCshiro
#
user=> (contains? () "A")
IllegalArgumentException contains? not supported on type: clojure.lang.PersistentList$EmptyList  clojure.lang.RT.contains (RT.java:724)
#
これは従来のLispの感覚だとはまるなあ。
#
つまりリストはコレクションじゃないってことか。
2016/07/28 13:12:23 UTC(び)
#
user=> (contains? nil "A")
false
#
この不条理感
2016/07/28 13:13:43 UTCshiro
#
一応理由はある http://java.ociweb.com/mark/clojure/article.html#Lists
#
リストから探すのは線形探索になるからsetを使えってことらしい
#
しかし「要素数個なら新たにセットをアロケートするより線形探索の方が速い」という思考に犯されてるからついついいちいちset作るの躊躇しちゃうな
2016/07/28 13:16:34 UTC(び)
#
まぁ、確かにClojure書く時、あんまりリストって使わない気がする。
#
user=> (contains? (map s/upper-case ["hoge" "moke" "fuga"]) "MOKE")
IllegalArgumentException contains? not supported on type: clojure.lang.LazySeq  clojure.lang.RT.contains (RT.java:829)
#
これちょっと嫌だな。
2016/07/28 13:21:11 UTCshiro
#
要素数が既知だとベクタ作りやすいからそっちを多用するね。
#
シーケンスに対しては(some #(= elt %) seq) がイディオムなんだな。
2016/07/28 13:23:23 UTC(び)
#
(some #(= "MOKE" %) ["HOGE" "MOKE" "FUGA"])
#
こう書け、と。
#
んー