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