在Clojure中扩展自定义Java类,映射和序列的协议

mik*_*era 5 java protocols clojure data-structures

我在Clojure 1.2中创建了一个协议来处理我自己的Java类,并且对通用的java.lang.Object进行了默认处理.代码看起来像:

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

  java.lang.Object
    (protocol-function [c]
      "Default object result"))
Run Code Online (Sandbox Code Playgroud)

我应该如何扩展它以对标准Clojure数据结构(特别是地图,向量和序列)进行特殊处理?

Mic*_*zyk 4

Clojure 的所有持久数据结构都实现了扩展clojure.lang.PersistentCollection. Clojure 的瞬态集合实现了clojure.lang.TransientCollection. 您可以将协议扩展到这些,就像将其扩展到类一样(尽管仅处理持久集合可能更有意义)。

  • 明确命名它们,以防需要进行不同的处理:`clIPercientMap`、`clIPercientVector`、`clIPercientSet`(其中有一些系统...)以及序列`clISeq`。 (2认同)