CLOS如何与Clojure的类型和记录功能相关?

时间:2011-04-18 07:56:29

标签: clojure lisp common-lisp

我最近一直在使用Clojure的类型和记录,我想知道这些是非常新的概念,还是受到Common Lisp对象系统的启发?

1 个答案:

答案 0 :(得分:12)

我相信它们在Clojure中几乎都是新的创新。

CLOS是一个相当复杂,功能齐全的面向对象系统。它具有您经常听到的各种OOP技术,并且存在于其他面向对象的语言中 - 多继承,动态调度,泛型函数等。

Clojure采用不同的方法 - 类型和记录比完整的OOP简单得多,并不打算构成完整的OOP系统。相反,我理解设计的动机是:

  • 认为许多OOP技术在构建大型系统时实际上是有害的 - 例如实现继承
  • 最常见的多态性案例(即单一派遣类型)获得最大性能(即与Java相同)的机会
  • 解决“expression problem”的愿望,你可以在Clojure中使用deftype / defrecord和协议来完成
  • 使所有记录/类型不可变的意图,以符合Clojure的其他哲学

如果你想要一个像CLOS这样的传统面向对象系统,那么就可以在Clojure中在类型和记录之上构建它。您还可以直接在Clojure中使用Java风格的面向对象。但是我相信Clojure专家通常不会推荐它--Clojure通常会为您提供不同或更好的方法来解决相同的问题。

一般而言 - Clojure倾向于为您提供“简单”工具,您可以编写这些工具来解决手头的问题,而不是在任何时候规定复杂的框架。这是一个interesting philosophy discussed at some length in this video by Stuart Halloway