我希望使用clojure STM来存储我的应用程序的数据,但是要让数据结构无形地将结构保存到数据存储区。如何使用我自己的功能扩展内置类型,以便API的用户不知道。
请注意,我希望使用所有标准的clojure调用来操作数据结构,从而使API的调用者不知道。这有可能吗?
答案 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和协议化发生。我爱是错的。 :)