clojure.lang真的只是实现细节吗?

时间:2015-11-21 15:48:30

标签: clojure implementation leaky-abstraction

在Clojure中,一些任务(例如实例化PersistentQueue或使用deftype来实现与clojure.core函数兼容的自定义数据类型)需要知道类和/或clojure.lang中的接口。

然而,根据clojure.lang/package.html

  

唯一被认为是公共API一部分的类是clojure.lang.IFn。所有其他类应被视为实现细节。

这些陈述是不正确还是过时?如果是这样,是否有计划在将来纠正它们?如果没有,是否有更优选的方式来执行上述任务,或者它们是否应该在惯用的Clojure代码中完全没有完成?

1 个答案:

答案 0 :(得分:2)

亚历克斯·米勒过去曾commented(虽然整个帖子值得一读):

  

我会说Clojure的内部存在一系列“公开”的感觉。

     
      
  • 新的Clojure API(clojure.java.api.Clojure)是Clojure外部调用者的官方公共API。此API基本上包含解析变量和调用函数的方法。
  •   
  • 对于Clojure中的Clojure用户,几乎任何公开且具有文档字符串的var,并且在api文档中显示都可以被视为公共API。
  •   
  • 私有或没有文档字符串的Clojure变量(这样公共API文档中省略了var)可能会非常谨慎。
  •   
  • Clojure内部Java接口[clojure.lang]当然是为了让库构建者能够创建在Clojure世界中发挥作用的有用东西。我不知道有人曾经说过他们是“公开的”,但我当然认为任何可能打破外部用户的核心界面的改变都会被认真考虑。
  •   
  • 在大多数情况下,Clojure内部Java类[clojure.lang]应被视为私有,如有更改,恕不另行通知。甚至还有灰色区域。
  •   
     

通常,我们不会对封装或隐藏内部构件给予高度重视。在大多数情况下,如果内部成员可能对进行有趣事情的高级用户有用,则可以使用内部结构,但需要注意的是,在未来的版本中,您更容易被意外破坏。