为什么Clojure核心库使用具体的派生?

Sam*_*tep 10 inheritance clojure

Clojure的类型机制文档中,有人说

  • 具体推导是坏事
    • 你不能从具体类,只有接口派生数据类型

但是,一些核心Clojure类使用具体派生(还有其他示例,但这些是超类属于其中的唯一情况clojure.lang):

  • ARef 扩展 AReference
  • Agent 扩展 ARef
  • Atom 扩展 ARef
  • Namespace 扩展 AReference
  • Ref 扩展 ARef
  • Var 扩展 ARef

另外,还有很多抽象类.但是,没有办法在Clojure中创建一个抽象类的等价物,对我来说,抽象类的扩展似乎具有与常规具体派生相同的缺点.

为什么在这里使用具体的推导?

Dav*_*zhu 3

在谈到哲学问题时,我觉得自己不够权威,但这是我的两点意见。

您引用的文本出现在那里的原因是警告滥用defrecorddeftype。Clojure 不鼓励将记录/类型公开为 API。相反,应该尽可能公开接口。毕竟,OO 语言公开类,而 FP 语言公开函数/方法/接口。

另一方面,您提到 clojure 的实现本身使用抽象类并继承它们。我宁愿将这些视为“某人必须做的肮脏工作”。JVM 的设计使其在 OO 世界中的原语上最高效。OO 世界虚拟机和 FP 世界语言之间的差距必须由某人来填补。