我一直在尝试将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类列表,它可能对扩展协议有用?
答案 0 :(得分:5)
这里没有直接的答案,但有一些有用的资源:
答案 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
似乎是一个有用的类,用于扩展您希望所有顺序集合的一般实现的协议。