我已经知道Clojure列表和向量大多是可以互换的,并且使用其中一个与conj
中的插入顺序或者在向量的情况下不需要引用等内容有关。
为什么那么
(into {} '( (1 2) (3 4)))
失败,而
(into {} '( [1 2] [3 4]))
成功?
答案 0 :(得分:6)
这是一个如何实现地图的工件。
地图在概念上被许多Clojure函数视为java.util.Map.Entry
元素的序列。碰巧在APersistentMap.java中有特殊的案例代码将长度为2的向量视为一个映射条目(在APersistentMap.cons中),但不是用于列表。
可以说,给矢量这种特殊处理是合理的,因为它们是在代码中表示地图输入文字的一种方便的形式。所以你可以编写如下内容:
(conj {} [:a 1])
=> {:a 1}