Types 要为Trie类型扩展哪个协议?

Types 要为Trie类型扩展哪个协议?,types,clojure,records,trie,Types,Clojure,Records,Trie,我正在Clojure中编写一个Trie数据结构的实现,我认为最好使用defrecord创建我自己的类型,这样可以重载对集合进行操作的函数。如何确定要扩展的协议的名称,以便为新的Trie类型实现conj和其他类似的函数?如果要实现新的数据结构,则需要使用deftype而不是defrecord,因为后者硬连线了结果类型的映射行为的特定实现 至于clojure.core收集函数,它们大多数基于接口而不是协议。但是ClojureScript确实使用协议。发现哪些接口可能与新数据结构相关的最简单方法是检查

我正在Clojure中编写一个Trie数据结构的实现,我认为最好使用defrecord创建我自己的类型,这样可以重载对集合进行操作的函数。如何确定要扩展的协议的名称,以便为新的Trie类型实现conj和其他类似的函数?

如果要实现新的数据结构,则需要使用deftype而不是defrecord,因为后者硬连线了结果类型的映射行为的特定实现

至于clojure.core收集函数,它们大多数基于接口而不是协议。但是ClojureScript确实使用协议。发现哪些接口可能与新数据结构相关的最简单方法是检查已经存在的类似数据结构:

;; all superclasses and interfaces of the class of {}, that is,
;; clojure.lang.PersistentArrayMap
(ancestors (class {}))

;; interfaces only
(filter #(.isInterface %) (ancestors (class {})))

既然您计划实现一个trie,我猜您想要实现一个map或set。如果是这样,请在ClojureScript版本中实现所有相关接口和所有相关协议–您可以查看源代码。

非常好,谢谢!不过,我还有一个问题,如何确定要扩展的函数的名称和参数顺序?例如,我知道空?是set接口的一部分,但在java代码中它显示为空。此外,cons将序列作为第二个参数,但在协议中定义函数时,参数列表希望将其作为第一个参数。如何解决这个问题?对于clojure.lang接口,您可以查看clojure本身或实现上述data.avl等接口的库的源代码。对于JDK提供的接口,阅读Javadoc更有意义,其他接口则很容易通过google获得。面向用户的函数接受其参数的顺序并不重要;您需要实现clojure中相应接口和函数中声明的方法。core将负责调用它们。另外,是否为空?不直接对应于任何内置接口中的任何方法。相反,它是由not和seq构建的–请参见source empty?。clojure.lang.IPersistentCollection声明的方法empty对应于函数clojure.core/empty–请参阅doc empty以了解其功能的描述。