clojure中接口的不完整实现

时间:2012-05-22 18:03:52

标签: interface clojure deftype

Clojure允许实现接口不完整的deftype,例如

(deftype Foo [x] clojure.lang.ISeq (next [this] x))

Foo未实施seq)。来自Pythonic土地的鸭子打字,或者,最好(或最坏的,取决于你的POV),ABCs,我很难理解为什么这样的不完整是允许的实现,因为我认为接口的要点是保证存在一组方法(就像现在一样,似乎安全地使用其他人的deftype我必须在try...catch中包装每个“方法”调用。

2 个答案:

答案 0 :(得分:1)

这是Clojure动态语言哲学与Java静态语言哲学之间的交叉点之一。我同意,它确实显示了两者之间的混淆点。理由是允许clojure程序使用Java库而不会有任何不必要的痛苦,并且许多库要求您通过获取来传递实现方法的某个类的实例围绕Java缺乏一流的功能。从这个角度来看,权衡是有道理的,尽管从其他角度来看,它并不符合Java哲学。

答案 1 :(得分:1)

要求完全实施会破坏交互式编程。如果有人为您提供了一个不能完全实现ISeq的类型,那么他们就会给您一个破碎的类型。也就是说,一个Clojure linter / analyzer检查你的源实现疏忽听起来非常有用。