公共Lisp对象系统(CLOS)支持duck类型吗?

公共Lisp对象系统(CLOS)支持duck类型吗?,lisp,common-lisp,Lisp,Common Lisp,我正在读“实用的公共Lisp”,我想知道公共Lisp是否支持Duck类型,比如Ruby 在Ruby中,可以调用对象上的方法,而不考虑类,只要它使用调用方假定的名称和参数列表实现方法 CLOS呢?通过假设泛型函数将处理对象而不考虑对象的类,是否可以对对象调用方法。可能不需要duck类型,因为CLOS不遵循消息传递原理,方法也不绑定到类 可能不需要duck类型,因为CLOS不遵循消息传递原理,方法也不绑定到类 事实正是如此。每个泛型函数都可以为某个类动态专门化。也可以有一个默认实现。由于Lisp使用

我正在读“实用的公共Lisp”,我想知道公共Lisp是否支持Duck类型,比如Ruby

在Ruby中,可以调用对象上的方法,而不考虑类,只要它使用调用方假定的名称和参数列表实现方法

CLOS呢?通过假设泛型函数将处理对象而不考虑对象的类,是否可以对对象调用方法。可能不需要duck类型,因为CLOS不遵循消息传递原理,方法也不绑定到类

可能不需要duck类型,因为CLOS不遵循消息传递原理,方法也不绑定到类


事实正是如此。每个泛型函数都可以为某个类动态专门化。也可以有一个默认实现。由于Lisp使用动态类型,每个函数都可以用任何类型的参数调用,对于泛型函数,基于参数类型的分派决策在运行时进行。

注意,如果您需要一个始终能够处理的函数(没有运行时错误的“找不到函数”),您可以专门处理
t
,例如。,
(defmethod foo((传入对象t))…)
t
是类型图的顶部。(参见CLtL2的2.15)。我必须重新思考类是什么。在公共Lisp中,类不是由一组方法定义的(在Java等中通常称为接口)。谢谢