Clojure:为什么(进入{}'((1 2)(3 4)))失败?

时间:2013-06-22 21:12:38

标签: clojure

我已经知道Clojure列表和向量大多是可以互换的,并且使用其中一个与conj中的插入顺序或者在向量的情况下不需要引用等内容有关。

为什么那么

(into {} '( (1 2) (3 4))) 

失败,而

(into {} '( [1 2] [3 4]))

成功?

1 个答案:

答案 0 :(得分:6)

这是一个如何实现地图的工件。

地图在概念上被许多Clojure函数视为java.util.Map.Entry元素的序列。碰巧在APersistentMap.java中有特殊的案例代码将长度为2的向量视为一个映射条目(在APersistentMap.cons中),但不是用于列表。

可以说,给矢量这种特殊处理是合理的,因为它们是在代码中表示地图输入文字的一种方便的形式。所以你可以编写如下内容:

(conj {} [:a 1])
=> {:a 1}