4

clojure.lang.PersistentList$EmptyList2つの値が同じタイプであるかどうかを判断したいのですが、空のリストのタイプがではなくであることがわかりました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=> 

それで、なぜ空のリストのタイプが空でないリストのタイプと異なるのか、そして2つのものが同じタイプであるかどうかを判断する正しい方法は何でしょうか?

4

1 に答える 1

10

Clojureデータ構造の具体的なタイプに依存しないでください。これらは文書化されていない実装の詳細であり、Clojureの将来のバージョンで変更されないという保証はありません。

抽象化に依存する方がはるかに安全IPersistentListです(たとえば、またはISeqインターフェイスで定義されているように)。これらは、コードを壊す可能性のある方法で変更される可能性がはるかに低くなります(Rich Hickeyは、抽象化に関して下位互換性が非常に大きいと理解しています。具体的な実装に依存している場合、彼はそれがあなた自身のせいであると言うでしょう。物事が壊れた場合)

しかし、さらに良いことに、検出したいものに応じて、またはclojure.coreなどの関数を使用する必要があります。これらは、下位互換性を長期間維持する可能性が高いだけでなく、JVM以外のバージョンのClojure(ClojureScriptなど)でも正しく機能する可能性があります。seq?list?

于 2013-02-16T13:16:33.723 に答える