Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
clojure.lang真的只是实现细节吗?_Clojure_Implementation_Leaky Abstraction - Fatal编程技术网

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

clojure.lang真的只是实现细节吗?,clojure,implementation,leaky-abstraction,Clojure,Implementation,Leaky Abstraction,在Clojure中,某些任务(例如实例化或使用deftype实现与Clojure.core函数兼容的自定义数据类型)需要了解中的类和/或接口 然而,根据: 唯一被认为是公共API一部分的类是。所有其他类都应被视为实现细节 这些陈述是否不正确或过时?如果有,是否有计划在未来纠正这些问题?如果没有,是否有更可取的方法来执行上述任务,或者干脆不使用惯用的Clojure代码来完成这些任务?Alex Miller过去曾对此进行过讨论(尽管整个线程都值得一读): 我要说的是,Clojure的内部存在一系列“

在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.lang
    ]当然是为了让库生成器能够创建在Clojure世界中使用的有用的东西。我不知道是否有人说过它们是“公共的”,但我肯定认为,对核心界面的任何更改都可能会破坏外部用户,我们会非常仔细地考虑
  • Clojure内部Java类[
    Clojure.lang
    ]在大多数情况下都应被视为私有类,可以在不另行通知的情况下进行更改。即使在那里也有灰色地带
通常情况下,我们不会对封装或隐藏内部设置很高的值。在大多数情况下,如果高级用户在做有趣的事情时可能会用到内部构件,那么内部构件是可用的,但需要注意的是,您所做的事情越奇怪,您在未来的版本中被意外损坏的可能性就越大


仅仅因为
clojure.lang
的成员被认为是实现细节,并不意味着不允许引用它们。相反,它只是意味着你不应该期望这样的代码是可移植的(例如,Clojure和ClojureScript可能需要单独的代码)。@DaoWen
Clojure.lang
被视为实现细节意味着不仅仅是代码不可移植。严格来说,只要公共接口保持不变,实现细节就可以随时更改<然而,code>clojure.lang并不是那么好战。