在STM事务中重载clojure哈希映射

时间:2010-12-31 07:53:53

标签: clojure

我希望使用clojure STM来存储我的应用程序的数据,但是要让数据结构无形地将结构保存到数据存储区。如何使用我自己的功能扩展内置类型,以便API的用户不知道。

请注意,我希望使用所有标准的clojure调用来操作数据结构,从而使API的调用者不知道。这有可能吗?

2 个答案:

答案 0 :(得分:2)

不确定这是否正确,但您可以从clojure.lang扩展接口(协议)。以下是向地图的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中实例化和打印实例的最低限度)。对于所有读取操作,只需将实际映射函数作为实现进行传递就足够了。

答案 1 :(得分:1)

deftype旨在创建新的数据结构-y类型的东西,但我不确定你能否实现这些目标,直到Clojure内部的更多Clojure-in-Clojure和协议化发生。我爱是错的。 :)