Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在STM事务中重载clojure哈希映射_Clojure - Fatal编程技术网

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

在STM事务中重载clojure哈希映射,clojure,Clojure,我希望使用clojure STM为我的应用程序存储数据,但要让数据结构以不可见的方式将结构持久化到数据存储中。如何使用自己的功能扩展内置类型,以便API的用户不知道 注意,我希望使用所有当时的标准clojure调用来操作数据结构,从而使API的调用方不知道。这可能吗?deftype旨在创建新的数据结构-y类型的东西,但我不确定您是否能够实现这些目标,直到Clojure中的Clojure和Clojure内部的协议化出现。不过,我希望自己是错的。:) 不确定这是否是一种方式,但您可以从clojure

我希望使用clojure STM为我的应用程序存储数据,但要让数据结构以不可见的方式将结构持久化到数据存储中。如何使用自己的功能扩展内置类型,以便API的用户不知道


注意,我希望使用所有当时的标准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类型做一些研究,然后再回到这个问题上。感谢您的输入这是一个不错的起点: