Clojure / Java类和协议有一个简单的参考吗?

时间:2014-03-10 20:26:33

标签: java class clojure protocols extend

我一直在尝试将Clojure的协议扩展到已有的类型,但似乎每当我有一个问题时,“如何将此协议扩展到所有可用的集合?”或者“我如何将此协议扩展到所有数字(长数,比率,整数,浮点数等)?”我必须做很多谷歌搜索才能找到答案,即便如此,我也无法总能找到明确的答案。

是否有人知道常用的clojure.lang.Somethingjava.lang.SomeJavaClass等类和协议的方便参考?我认为,如果我们有一些资源可以帮助像我这样几乎没有Java经验的Clojurians,那将是有益的。

编辑:为了让您了解我正在寻找的内容,请参阅此代码:

(defprotocol X
  (do-something [this]))

(extend-protocol X
  ?????? <-- 
  (do-something [this] '(implementation goes here)))

是否有一个资源可能有一个Clojure / Java类列表,它可能对扩展协议有用?

2 个答案:

答案 0 :(得分:5)

这里没有直接的答案,但有一些有用的资源:

  • 我发现Stuart Sierra的class diagram项目对于可视化它依赖的Clojure和Java接口的类结构非常有用。
  • Chouser有一些旧的静态图here
  • 如果您是通过deftype创建自定义集合,则此scaffolding macro可以为您节省大量时间

答案 1 :(得分:1)

我想我半自己回答了自己的问题,虽然我仍然很想知道是否有人有更好的解决方案:

对于Java类,您可以通过Google搜索来开始,例如“Java Integer类”和the official docs将向您显示java.lang.Integer - >的继承链。 java.lang.Number - &gt; java.lang.Object。似乎大多数(如果不是全部......?)java.lang.X类可以在extend-protocol中缩写为X,因此Number应该用于将协议扩展到所有数字的子类。

似乎Clojure的在线文档没有清楚地显示这样的继承链,除非我遗漏了一些东西。但clojure.core/supers是一种方便的方法,至少可以找到类来尝试扩展协议,以获得您正在寻找的功能:

user> (class [])
;=> clojure.lang.PersistentVector

user> (supers (class []))
;=> #{clojure.lang.Sequential clojure.lang.ILookup clojure.lang.AFn
      clojure.lang.APersistentVector java.util.concurrent.Callable
      java.util.RandomAccess clojure.lang.Reversible java.util.List 
      clojure.lang.IHashEq java.util.Collection clojure.lang.IMeta 
      java.lang.Object java.io.Serializable clojure.lang.Associative 
      clojure.lang.Seqable clojure.lang.IEditableCollection java.lang.Iterable 
      clojure.lang.Counted java.lang.Runnable clojure.lang.IPersistentCollection 
      clojure.lang.IObj clojure.lang.IPersistentVector clojure.lang.Indexed 
      clojure.lang.IFn clojure.lang.IPersistentStack java.lang.Comparable} 

clojure.lang.Sequential似乎是一个有用的类,用于扩展您希望所有顺序集合的一般实现的协议。