通过宏传输管道时,映射条目成为向量

时间:2013-10-27 08:42:59

标签: clojure

在Clojure中,保留在宏中创建的地图条目......

(class (eval `(new clojure.lang.MapEntry :a 7)))
;=> clojure.lang.MapEntry

...但是当从外部环境中通过管道折叠到矢量...

(class (eval `~(new clojure.lang.MapEntry :a 7)))
;=> clojure.lang.PersistentVector

此行为在LispReader.syntaxQuote(Object form)条件if(form instanceof IPersistentCollection)内定义。

有没有人知道这是预期的行为还是会修复的东西?

1 个答案:

答案 0 :(得分:2)

如果你想了解这种行为,你需要深入研究Clojure序列和集合的构建。

事实上,每个Clojure地图都是一系列向量。每个[:key :val]对都存储为两个元素向量。

正确看看,你要求MapEntry的课程,这只是一个向量!相反,地图的Clojure类是clojure.lang.PersistentArrayMapclojure.lang.IPersistentMapMapEntry只是一个元素,是整个地图的一部分。而且,正如我所说,因为Clojure地图中的每个条目实际上都是一个向量,所以评估MapEntry的类是向量,应该是它。

希望我的解释是可以理解的。

相关问题