Clojure:Perlis vs Protocols / Records [soft,philosophical]

时间:2012-07-09 03:47:48

标签: clojure

上下文:

(A)“在一个数据结构上运行100个函数比在10个数据结构上运行10个函数更好。” -Alan Perlis

(B)Clojure有defProtocol,defRecord,defType

问题:

是否有一些编程风格的Clojure可以获得两者的好处?

(B)具有避免类型错误的优点。

(A)具有避免重复代码的优点。

由于

PS:我很乐意听到建设性的批评为什么我被贬低+如何重组问题以使其富有成效。

2 个答案:

答案 0 :(得分:1)

我不确定如何将(A)和(B)联合起来。

(A)是关于具有一致性,即如果您使用相同的数据结构来表示您的应用程序的各个层的数据(例如,存储在地图中的用户信息),那么它将使事情保持一致。如果使用许多数据结构来表示相同的信息,那么您将不得不编写代码以将结构从一种形式转换为另一种形式,并且在不同结构上工作的各种函数将不可组合,因为它们期望不同的数据结构。 / p>

(B)这是关于Clojure中的各种结构。

defprotocol:这不是关于数据结构而是关于契约/接口,即特定类型实现契约,并且类型可以在消费者函数需要传递类型来实现契约的任何上下文中使用。例如:任何可以打印到控制台(或其他可写字符串)的类型都将实现打印合同/协议。

defrecord:创建地图但使用默认方式实现的其他接口。

deftype:用于创建类型的低级构造,因此您必须为此编写大量代码。 99%的时间你不需要使用它。

答案 1 :(得分:0)

协调这一点的方法是考虑“抽象”而不是“数据类型”。或者用Alan Perlis的话来解释:

  

“最好让100个函数在一个抽象上运行   关于10个抽象的10个函数。“

所以Clojure的方式是:

  • 以简单,最小的方式定义您的抽象(使用defprotocol)
  • 针对此抽象编写函数
  • 使用defprotocol,deftype等定义实现抽象的具体类型(或者,如果您愿意,可以使用extend-protocol将协议扩展到现有的Java类)。