为 Trie 类型扩展哪个协议?

Which protocol to extend for Trie type?

我正在用 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,我猜您想要实现一个映射或集合。如果是这样,data.avl 实现了所有相关接口(以及 ClojureScript 版本中的所有相关协议)——您可以查看源代码。