Clojure/Java类和协议有简单的参考资料吗?

3
我一直在尝试将Clojure的协议扩展到已有的类型上,但似乎每当我有一个问题,比如“如何将此协议扩展到所有可序列化的集合?”或“如何将此协议扩展到所有数字(长整型、比率、整数、浮点数等)?”我都需要做很多谷歌搜索才能找到答案,即使这样,我也不能总是找到明确的答案。
有没有人知道一些常用的clojure.lang.Something、java.lang.SomeJavaClass等类和协议的便捷参考资料?我认为如果我们有一些资源可以帮助像我这样没有Java经验的Clojurians,那将是有益的。
编辑:为了让你了解我在寻找什么,看看这段代码:
(defprotocol X
  (do-something [this]))

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

有没有资源可以列出Clojure/Java类的列表,这些类对于扩展协议可能有用?

2
对于Clojure概念,https://github.com/Chouser/clojure-classes/blob/master/graph-w-legend.png是有用的但已经过时了。http://www.clojureatlas.com/看起来很有前途,但需要付费。 - Alex
2个回答

5
没有直接的答案,但有一些有用的资源:
  • 我发现 Stuart Sierra 的 class diagram 项目对于可视化 Clojure 和 Java 接口所依赖的类结构非常有用。
  • Chouser 在这里有一些旧的静态图表 here
  • 如果您通过 deftype 创建自定义集合,则此 scaffolding macro 可以节省您大量时间。

这些看起来都是非常有用的资源。谢谢!同时也感谢提到了 Chouser 的图表和 Clojure Atlas 的另一个 Alex。我得花些时间去玩耍这些东西。 - Dave Yarwood
自从我写下这篇回答以来,我与其他人合著了Pragmatic Press的《Clojure Applied》,其中包含有关Clojure中与集合和序列相关的关键Java接口的一些附加信息。 - Alex Miller

1
我认为我半个问题已经回答了,尽管我仍然好奇是否有更好的解决方案:
对于Java类,您可以从Google中搜索“Java Integer class”,官方文档将向您显示从java.lang.Integer -> java.lang.Number -> 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 似乎是一个有用的类,可以扩展协议,为所有序列集合提供通用实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接