Clojure のリストとベクトルはほとんど交換可能であり、どちらを使用するかは挿入順序conj
やベクトルの場合に引用する必要がないことなどに関係していることを理解しました。
なぜ
(into {} '( (1 2) (3 4)))
失敗しながら
(into {} '( [1 2] [3 4]))
成功しますか?
Clojure のリストとベクトルはほとんど交換可能であり、どちらを使用するかは挿入順序conj
やベクトルの場合に引用する必要がないことなどに関係していることを理解しました。
なぜ
(into {} '( (1 2) (3 4)))
失敗しながら
(into {} '( [1 2] [3 4]))
成功しますか?
これは、マップの実装方法の成果物です。
java.util.Map.Entry
マップは、多くの Clojure 関数によって要素のシーケンスとして概念的に扱われます。APersistentMap.javaには、長さ 2 のベクトルを (APersistentMap.cons 内の) マップ エントリとして扱うが、リストとして扱うための特別なケース コードがある場合があります。
ベクトルは、コード内でマップ エントリ リテラルを表現するのに便利な形式であるため、この特別な処理をベクトルに与える合理的なケースがあることはほぼ間違いありません。したがって、次のようなものを書くことができます。
(conj {} [:a 1])
=> {:a 1}