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

Zub*_*air 6 lisp clojure common-lisp

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

mik*_*era 12

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

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

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

  • 认为许多OOP技术在构建大型系统时实际上是有害的 - 例如实现继承
  • 对于最常见的多态性情况(即类型上的单一调度)获得最大性能(即与Java相同)的机会
  • 希望解决" 表达问题 ",你可以在Clojure中使用deftype/defrecord和协议
  • 意图使所有记录/类型不可变,以符合Clojure的其他哲学

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

一般来说 - Clojure倾向于为您提供"简单"工具,您可以编写这些工具来解决手头的问题,而不是在任何时候规定复杂的框架.这是一个在这个视频由Stuart哈洛韦在一定程度上讨论有趣的理念.

  • 这是一个很好的描述,但我不同意CLOS"相当复杂".我发现它非常简单.TAOMP在大约1000个LOC中实现了它 - 我知道的唯一其他对象系统是Smalltalk.即使CLOS的"高级"功能也不是那么"复杂","而不是做出任何限制,我们保持开放,并宣称它是标准接口的一部分,因此你可以依赖它".你已经有了带插槽的类,以及通用的函数和方法......一切都很不合适. (4认同)
  • CLOS是传统的吗?还有什么其他系统能够像CLOS一样提供通用功能?甚至包括泛型函数的概念? (4认同)