0

在 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)此行为在condition内部定义if(form instanceof IPersistentCollection)

有谁知道这是预期的行为还是将要修复的东西?

4

1 回答 1

2

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

事实上,每个 Clojure 映射在下面都是一个向量序列。每[:key :val]对存储为两个元素向量。

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

希望我的解释可以理解。

于 2013-10-27T09:38:02.970 回答