Clojure:Perlis vs协议/记录[软,哲学] 背景:

Clojure:Perlis vs协议/记录[软,哲学] 背景:,clojure,Clojure,(A) “让100个函数在一个数据结构上运行比让10个函数在10个数据结构上运行要好。”-Alan Perlis (B) Clojure具有defProtocol、defRecord和defType 问题: 是否有某种编程风格的Clojure既能从两者中获益 (B) 具有避免类型错误的优点 (A) 具有避免重复代码的优点 谢谢 PS:我很想听到建设性的批评,关于我为什么被否决,以及如何重组问题以使其富有成效。我不知道你如何将(A)和(B)联系起来 (A) 是关于保持一致性,即如果在应用程序的各个

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

(B) Clojure具有defProtocol、defRecord和defType

问题: 是否有某种编程风格的Clojure既能从两者中获益

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

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

谢谢


PS:我很想听到建设性的批评,关于我为什么被否决,以及如何重组问题以使其富有成效。

我不知道你如何将(A)和(B)联系起来

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

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

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

defrecord
:创建地图,但以默认方式实现一些附加接口


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

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

“让100个函数在一个抽象上运行要比 10个抽象的10个函数。”

因此,Clojure的方法是:

  • 以简单、最少的方式定义抽象(使用defprotocol)
  • 根据这个抽象编写函数
  • 定义使用defprotocol、deftype等实现抽象的具体类型(或者如果愿意,使用extend-protocol将协议扩展到现有的Java类)

任何值得[软的、哲学的]的问题都不属于这一类,因此,会有反对票——试着回答这类问题。这里实际上有一个有趣的“硬”问题。。。看到我的答案了吗