clojure.lang真的只是实现细节吗?
在Clojure中,某些任务(例如实例化或使用clojure.lang真的只是实现细节吗?,clojure,implementation,leaky-abstraction,Clojure,Implementation,Leaky Abstraction,在Clojure中,某些任务(例如实例化或使用deftype实现与Clojure.core函数兼容的自定义数据类型)需要了解中的类和/或接口 然而,根据: 唯一被认为是公共API一部分的类是。所有其他类都应被视为实现细节 这些陈述是否不正确或过时?如果有,是否有计划在未来纠正这些问题?如果没有,是否有更可取的方法来执行上述任务,或者干脆不使用惯用的Clojure代码来完成这些任务?Alex Miller过去曾对此进行过讨论(尽管整个线程都值得一读): 我要说的是,Clojure的内部存在一系列“
deftype
实现与Clojure.core
函数兼容的自定义数据类型)需要了解中的类和/或接口
然而,根据:
唯一被认为是公共API一部分的类是。所有其他类都应被视为实现细节
这些陈述是否不正确或过时?如果有,是否有计划在未来纠正这些问题?如果没有,是否有更可取的方法来执行上述任务,或者干脆不使用惯用的Clojure代码来完成这些任务?Alex Miller过去曾对此进行过讨论(尽管整个线程都值得一读):
我要说的是,Clojure的内部存在一系列“公开性”
- 新的Clojure API(Clojure.java.API.Clojure)是Clojure外部调用方的官方公共API。该API基本上包括解析变量和调用函数的方法
- 对于Clojure中的Clojure用户来说,几乎任何公共的、有docstring并显示在api文档中的var都可以被视为公共api
- Clojure变量是私有的或没有文档字符串(例如,在公共api文档中省略了该变量)可能是需要非常小心处理的地方
- Clojure的内部Java接口[
]当然是为了让库生成器能够创建在Clojure世界中使用的有用的东西。我不知道是否有人说过它们是“公共的”,但我肯定认为,对核心界面的任何更改都可能会破坏外部用户,我们会非常仔细地考虑李>Clojure.lang
- Clojure内部Java类[
]在大多数情况下都应被视为私有类,可以在不另行通知的情况下进行更改。即使在那里也有灰色地带Clojure.lang
仅仅因为
clojure.lang
的成员被认为是实现细节,并不意味着不允许引用它们。相反,它只是意味着你不应该期望这样的代码是可移植的(例如,Clojure和ClojureScript可能需要单独的代码)。@DaoWenClojure.lang
被视为实现细节意味着不仅仅是代码不可移植。严格来说,只要公共接口保持不变,实现细节就可以随时更改<然而,code>clojure.lang并不是那么好战。