在STM事务中重载clojure哈希映射
我希望使用clojure STM为我的应用程序存储数据,但要让数据结构以不可见的方式将结构持久化到数据存储中。如何使用自己的功能扩展内置类型,以便API的用户不知道在STM事务中重载clojure哈希映射,clojure,Clojure,我希望使用clojure STM为我的应用程序存储数据,但要让数据结构以不可见的方式将结构持久化到数据存储中。如何使用自己的功能扩展内置类型,以便API的用户不知道 注意,我希望使用所有当时的标准clojure调用来操作数据结构,从而使API的调用方不知道。这可能吗?deftype旨在创建新的数据结构-y类型的东西,但我不确定您是否能够实现这些目标,直到Clojure中的Clojure和Clojure内部的协议化出现。不过,我希望自己是错的。:) 不确定这是否是一种方式,但您可以从clojure
注意,我希望使用所有当时的标准clojure调用来操作数据结构,从而使API的调用方不知道。这可能吗?deftype旨在创建新的数据结构-y类型的东西,但我不确定您是否能够实现这些目标,直到Clojure中的Clojure和Clojure内部的协议化出现。不过,我希望自己是错的。:) 不确定这是否是一种方式,但您可以从
clojure.lang
扩展接口(协议)。下面是一个非常简单的示例,它向map的assoc
函数添加了一个副作用(如您所需)
(deftype LolMap [m]
clojure.lang.IPersistentMap
(assoc [this k v] (do (println (str k " CAN HAS " v "!"))
(LolMap. (assoc m k v))))
clojure.lang.Seqable
(seq [this] (seq m)))
该类型只是包装了一个真实的映射,您必须为所有映射提供适当的实现
所涉及的接口(IPersistentMap和Seqable是能够在REPL中实例化和打印实例的最小接口)。对于所有读取操作,只需将realmap函数作为实现传递就足够了。我不确定这是否是重复的:在某些方面,它是重复的,是的。在这个问题中,我试图了解有关重载clojure核心函数的更多信息。我是否会覆盖clojure.core导入以在代码中使用此修订版本?您不会。这就是多态性在clojure中与数据类型和协议一起工作的方式。
assoc
函数对于所有“普通”映射都是一样的-只有当它应用于您的自定义类型时,它才会使用您的实现(根据第一个参数的类型分派)。我仍然不明白,但我会对Clojure类型做一些研究,然后再回到这个问题上。感谢您的输入这是一个不错的起点: