2010-08-02 42 views
5

我在Clojure 1.2中创建了一个处理我自己的Java类的协议,并且具有对通用java.lang.Object的默认处理。代码看起来是这样的:在Clojure中为自定义Java类,地图和序列扩展协议

(extend-protocol PMyProtocol 
    my.java.ClassName 
    (protocol-function [c] 
     "My Java class result") 

    java.lang.Object 
    (protocol-function [c] 
     "Default object result")) 

我应该如何扩展,以有标准Clojure的数据结构(尤其是地图,矢量和序列)特殊处理?

回答

4

所有的Clojure持久数据结构都实现了扩展clojure.lang.PersistentCollection的接口。 Clojure的短暂收藏实现了clojure.lang.TransientCollection。您可以将协议扩展到这些协议,就好像您将协议扩展到一个类一样(尽管处理持久集合可能会更有意义)。

+2

要明确命名它们以防止需要不同的处理:'c.l.IPersistentMap','c.l.IPersistentVector','c.l.IPersistentSet'(有一些系统在里面......)和序列'c.l.ISeq'。 – kotarak 2010-08-02 15:07:23

+0

谢谢Michal和kotarak!我最终使用了clojure.lang.IPersistentMap和clojure.lang.ISeq,它们运行良好。 – mikera 2010-08-02 20:50:43