consとconjの違い
初心者も初心者でなくても(e.g. ayato-p.icon)、分からなかったり/良く覚えてなかったりするポイント。
過去にハマった方一覧
consとconjの違い
consでつないだlistは、list?関数で比較するとfalseになっちゃうわけ
カマイルカさんlagenorhynque.iconがTwitter/icons/twitter.iconで幾つか参考になることを言っていたのでまとめておく。
/icons/twitter.icon 公式のドキュメントに若干の解説がある
Why does conj add to the front of a list, but the back of a vector?
端的に言えば、conjはパフォーマンスを意識して設計されているので、型毎に最も効率のよいやりかたで要素をコレクションに追加する
つまり、リストに対して使えば前方、ベクターに対して使えば後方に追加する
もし、目的が「要素をコレクションの前方に追加する」ならconsを使えばいい
ただし、このとき返却されるコレクションは元のコレクションとは異なる
これは遅延シーケンスを扱うときに便利
/icons/twitter.icon Clojureのconsは"sequence"という抽象に対するもので、conjは"collection"に対するもの
「シーケンス関数は最終引数、コレクション関数は第1引数に対象を取るという慣習」に従っている
I keep forgetting that after calling sequence functions on vectors/sets, the return value is no longer a vector or a set.
実はconjとconsのドキュメントにも書いてあったりする
https://clojuredocs.org/clojure.core/conj
Returns a new collection with the xs 'added'.
https://clojuredocs.org/clojure.core/cons
Returns a new seq where x is the first element and seq is the rest.
その他のツイート
https://twitter.com/lagenorhynque/status/935508151108956160
https://twitter.com/lagenorhynque/status/935510313574662144
その他の参照
Clojure: cons(seq) vs. conj(list)
Cons and Lazy Sequences in Clojure
#Clojure