4

我想判断两个值是否属于同一类型,但我发现空列表的类型是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=> 

所以,我想知道为什么空列表的类型与非空列表的类型不同,以及判断两个事物是否属于同一类型的正确方法是什么?

4

1 回答 1

10

不要依赖 Clojure 数据结构的具体类型。它们是未记录的实现细节,您无法保证它们在 Clojure 的未来版本中不会发生变化。

依赖抽象(例如由or接口定义的)要安全得多。这些不太可能以可能破坏您的代码的方式发生变化(我的理解是 Rich Hickey 在抽象方面非常注重向后兼容性。如果您依赖具体的实现,我相信他会说这是您自己的错如果事情破裂)IPersistentListISeq

更好的是,您应该使用或clojure.core等函数,具体取决于您要检测的内容。这些不仅可能长期保持向后兼容性,而且有机会在非 JVM 版本的 Clojure(例如 ClojureScript)上正常工作。seq?list?

于 2013-02-16T13:16:33.723 回答