Common Lisp中的列表对象方法(CLOS)

cor*_*ump 4 lisp oop common-lisp clos

有没有办法让对象定义所有方法并检查对象是否响应指定的方法?

寻找类似Ruby的"foo".方法

(list-methods *myobj*) ;; -> (method0 method1 methodN)
Run Code Online (Sandbox Code Playgroud)

还有像ruby的"foo".respond_to?:方法

(has-method-p *myobj* 'foo-method) ;; -> T
Run Code Online (Sandbox Code Playgroud)

对于插槽,有slot-exists-p什么方法?

谢谢.

sds*_*sds 7

Common Lisp对象模型基于泛型函数的概念,因此方法附加到GF,而不是普通对象,请参阅generic-function-methods(它在MOP中,而不是ANSI CL,所以你需要找到它所使用的包apropos或者find-all-symbols) .

Common Lisp对象系统具有非常强大的MetaObject协议.您可以使用它来查看(并经常修改!)有关对象和函数的大量内部信息.

  • 我建议使用库close-mop,它为一些(大多数?)常见的lisp实现提供对MOP的统一访问. (7认同)

Tim*_*Tim 5

您可以使用MOP函数SPECIALIZER-DIRECT-GENERIC-FUNCTIONS来查找包含专门针对类的方法的所有泛型函数,这与您在Ruby中所要求的接近.实际上,您可以找到专门用于类或其任何超类的所有泛型函数(对于SBCL;对于其他实现,请查看close-mop或实现的mop包):

(defun find-all-gfs (class-name)
  (remove-duplicates
   (mapcan (lambda (class)
             (copy-list (sb-mop:specializer-direct-generic-functions class)))
           (sb-mop:compute-class-precedence-list (find-class class-name)))))
Run Code Online (Sandbox Code Playgroud)

这个函数的问题在于许多内置的泛型函数专注于泛型超类型T,所以在SBCL中你会得到一个605泛型函数的列表,这可能不是那么有趣.但是,您可以使用这种通用方法构建一些有趣的工具,例如,通过过滤基于包的超类列表或通用函数.