Clojure 协议源自什么语言的什么特性?
注意:这不是关于“如何使用协议”的问题
这是一个关于是什么激发了这个想法的问题。
特别是,我想要的是得到类似的东西:
- XYZ + ABC 启发了 Clojure 协议
然后,我可以开始阅读人们使用 XYZ 和 ABC 获得语言功能的方向。
谢谢!
Clojure 协议源自什么语言的什么特性?
注意:这不是关于“如何使用协议”的问题
这是一个关于是什么激发了这个想法的问题。
特别是,我想要的是得到类似的东西:
然后,我可以开始阅读人们使用 XYZ 和 ABC 获得语言功能的方向。
谢谢!
如果您了解 Java,Clojure 协议类似于 Java 接口——但更好。Clojure 网站对协议进行了这样的说明(并且该页面上有更多关于协议的背景信息和基本原理):
- 提供高性能的动态多态结构作为接口的替代方案
- 支持接口的最佳部分
- 只有规范,没有实现
- 一个类型可以实现多个协议
- 在避免一些缺点的同时
- 实现哪些接口是类型作者在设计时选择的,以后不能扩展(尽管接口注入最终可能会解决这个问题)
- 实现一个接口会创建一个 isa/instanceof 类型关系和层次结构
- 通过允许不同方独立扩展类型集、协议和协议的实现来避免“表达问题”
- 这样做没有包装器/适配器
- 支持 90% 的多方法案例(类型单一调度),同时提供更高级别的抽象/组织
此外,您可能会发现用 Clojure 1.2 解决表达式问题很有趣:
Clojure 专家 Stuart Sierra 向您介绍了 Clojure 1.2 中解决表达式问题的新功能,这是一个经典的编程难题。协议允许您将预先存在的类型扩展为新方法,而数据类型允许您将预先存在的方法扩展为新类型——所有这些都无需更改现有代码。您还将看到 Java™ 接口和类如何与 Clojure 协议和数据类型进行交互。
我不知道,除了解决表达式问题的愿望之外,Clojure 协议是否受到某些东西的启发,但是协议正在做与 Haskell 类型类类似的事情,例如......
查看这个问题以获取更多信息 - 它还提到了 Scala 特征