在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)
内定义。
有没有人知道这是预期的行为还是会修复的东西?
答案 0 :(得分:2)
如果你想了解这种行为,你需要深入研究Clojure序列和集合的构建。
事实上,每个Clojure地图都是一系列向量。每个[:key :val]
对都存储为两个元素向量。
正确看看,你要求MapEntry
的课程,这只是一个向量!相反,地图的Clojure类是clojure.lang.PersistentArrayMap
或clojure.lang.IPersistentMap
。 MapEntry
只是一个元素,是整个地图的一部分。而且,正如我所说,因为Clojure地图中的每个条目实际上都是一个向量,所以评估MapEntry
的类是向量,应该是它。
希望我的解释是可以理解的。