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

时间:2015-11-17 23:29:02

标签: inheritance clojure

documentation of Clojure's type mechanisms中,声明

  
      
  • 具体推导不好      
        
    • 您无法从具体类派生数据类型,只能从接口
    • 派生数据类型   
  •   

然而,一些core Clojure classes使用了具体的派生(还有其他例子,但这些是超类属于clojure.lang的唯一情况):

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

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

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

1 个答案:

答案 0 :(得分:3)

在谈到哲学的时候,我觉得自己不够权威,但这是我的两分钱。

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

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