2015-11-21 52 views
4

在Clojure中,某些任务(如实例化PersistentQueue或使用deftype实现与clojure.core函数兼容的自定义数据类型)需要了解clojure.lang中的类和/或接口。clojure.lang真的只是实现细节?

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

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

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

+0

仅仅因为'clojure.lang'的成员被认为是实现细节并不意味着你不能引用它们。相反,它只是意味着你不应该期望这样的代码是可移植的(例如,你可能需要为Clojure和ClojureScript分开编写代码)。 – DaoWen

+1

@DaoWen clojure.lang被认为是一个实现细节,不仅仅意味着代码不是可移植的。从最严格的意义上讲,只要公共接口保持不变,实现细节可以随时更改。然而'clojure.lang'并不是那么好战。 –

回答

2

亚历克斯·米勒对这个commented过去(整个主题是值得一读,虽然):

我会说有一系列的“公共” -ness到的Clojure的内部的。

  • 新的Clojure API(clojure.java.api.Clojure)是Clojure的外部来电者的正式公开的API。这个API基本上包括解决变量和调用函数的方法。
  • 对于Clojure中的Clojure用户,几乎所有公开的var都有一个文档字符串,并且显示在api文档中可以被视为公共API。
  • 私密或没有文档字符串的Clojure vars(例如,从公共api文档中省略var)可能需要非常小心。
  • Clojure内部Java接口[clojure.lang]肯定是为了让图书馆建设者能够创建在Clojure世界中发挥作用的有用内容。我不知道有人曾经说过他们是“公开”的,但我肯定认为任何对可能打破外部用户的核心界面的改变都会被认真考虑。
  • Clojure内部Java类[clojure.lang]在大多​​数情况下应该被认为是私有的,如有更改,恕不另行通知。即使在那里也有灰色地带。

一般来说,我们并没有对封装或隐藏内部进行很高的评价。在大多数情况下,如果内部消息对于高级用户可能对做有趣的事情有用,那么内部消息仍然可用,但要注意的是,你做的事情越是奇怪,越有可能在未来的版本中被意外破坏。