4

在 Clojure 中,某些任务(例如实例化 aPersistentQueuedeftype用于实现与函数兼容的自定义数据类型clojure.core)需要了解clojure.lang.

但是,根据clojure.lang/package.html

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

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

4

1 回答 1

2

亚历克斯·米勒(Alex Miller)过去曾对此发表过评论(尽管整个帖子都值得一读):

我想说 Clojure 的内部存在一系列“公共”特性。

  • 新的 Clojure API (clojure.java.api.Clojure) 是 Clojure 外部调用者的官方公共 API。这个 API 基本上由解析变量和调用函数的方法组成。
  • 对于 Clojure 中的 Clojure 用户,几乎所有公开的、具有文档字符串并显示在 api 文档中的 var 都可以被视为公共 API。
  • 私有的或没有文档字符串的 Clojure 变量(例如公共 api 文档中省略了该变量)可能是需要非常小心的地方。
  • Clojure 内部 Java 接口 [ clojure.lang] 当然是为了让库构建者创建在 Clojure 世界中使用的有用的东西。我不知道是否有人说过它们是“公开的”,但我当然认为对可能破坏外部用户的核心界面的任何更改都会被非常谨慎地考虑。
  • Clojure 内部 Java 类 [ clojure.lang] 在大多数情况下应被视为私有的,如有更改,恕不另行通知。甚至那里也有灰色地带。

一般来说,我们不会高度重视封装或隐藏内部结构。在大多数情况下,如果内部组件可能对高级用户做有趣的事情有用,那么它们是可用的,但需要注意的是,你做的事情越奇怪,你就越有可能在未来的版本中被意外破坏。

于 2015-11-22T03:37:15.287 回答