如何将现有函数应用于新类?

qiu*_*fei 4 clojure

在我的项目中,许多客户端将修改服务器中的地图.我用的refmap这样的:

(def dict (ref {})) ; the map we play with
Run Code Online (Sandbox Code Playgroud)

我使用dosyncSTM方式更新此地图.但我发现它没有我想要的那么快:

user=> (time (dotimes [n 1000000] (dosync ( alter xx assoc xx 1 1))))
"Elapsed time: 2470.766 msecs"
Run Code Online (Sandbox Code Playgroud)

所以我决定使用原生的Java CuncurrentHashMap代替Clojure内置映射和STM.如何将Java CuncurrentHashMap包装到Clojure中,以便我可以像Clojure map一样修改它,使用assoc,contains?,dissoc等等.这将使我修改至少代码行.

有没有办法实现这个目标?

Ank*_*kur 7

您可以使用atom,因为您只修改单个值,因此不需要事务,因此不需要ref

user=> (def dict (atom {}))
user=> (time (dotimes [n 1000000] (swap! dict assoc :xx 1)))
"Elapsed time: 108.105703 msecs"
Run Code Online (Sandbox Code Playgroud)