我想判断两个值是否具有相同的类型,但我发现空列表的类型是clojure.lang.PersistentList$EmptyList而不是clojure.lang.PersistentList。
user=> (def la '())
#'user/la
user=> (def lb '(1 2))
#'user/lb
user=> (def t (map type [la lb]))
#'user/t
user=> t
(clojure.lang.PersistentList$EmptyList clojure.lang.PersistentList)
user=> (apply = t)
false
user=> 所以,我想知道为什么空列表的类型不同于非空列表的类型,以及判断两个对象是否属于同一类型的正确方法是什么?
发布于 2013-02-16 21:16:34
Clojure不要依赖于数据结构的具体类型。它们是没有文档记录的实现细节,您不能保证它们在Clojure的未来版本中不会更改。
依赖抽象(例如,由IPersistentList或ISeq接口定义的抽象)的要安全得多。这些不太可能以破坏代码的方式进行更改(我的理解是,Rich Hickey在抽象方面非常注重向后兼容性。如果你依赖一个具体的实现,我相信他会说,如果事情坏了,那是你自己的错)
但对于更好的,您应该使用clojure.core中的函数,如seq?或list?,具体取决于您想要检测的是什么。它们不仅可能在很长一段时间内保持向后兼容性,而且还有机会在Clojure的非JVM版本(例如ClojureScript)上正确工作。
https://stackoverflow.com/questions/14909312
复制相似问题