Clojure允许实现接口不完整的deftype
,例如
(deftype Foo [x] clojure.lang.ISeq (next [this] x))
(Foo
未实施seq
)。来自Pythonic土地的鸭子打字,或者,最好(或最坏的,取决于你的POV),ABCs,我很难理解为什么这样的不完整是允许的实现,因为我认为接口的要点是保证存在一组方法(就像现在一样,似乎安全地使用其他人的deftype
我必须在try...catch
中包装每个“方法”调用。
答案 0 :(得分:1)
这是Clojure动态语言哲学与Java静态语言哲学之间的交叉点之一。我同意,它确实显示了两者之间的混淆点。理由是允许clojure程序使用Java库而不会有任何不必要的痛苦,并且许多库要求您通过获取来传递实现方法的某个类的实例围绕Java缺乏一流的功能。从这个角度来看,权衡是有道理的,尽管从其他角度来看,它并不符合Java哲学。
答案 1 :(得分:1)
要求完全实施会破坏交互式编程。如果有人为您提供了一个不能完全实现ISeq的类型,那么他们就会给您一个破碎的类型。也就是说,一个Clojure linter / analyzer检查你的源实现疏忽听起来非常有用。