有没有办法让对象定义所有方法并检查对象是否响应指定的方法?
寻找类似Ruby的“foo”.methods
(list-methods *myobj*) ;; -> (method0 method1 methodN)
还有像ruby的“foo”.respond_to? :方法
(has-method-p *myobj* 'foo-method) ;; -> T
对于插槽有slot-exists-p,方法是什么?
谢谢 .
有没有办法让对象定义所有方法并检查对象是否响应指定的方法?
寻找类似Ruby的“foo”.methods
(list-methods *myobj*) ;; -> (method0 method1 methodN)
还有像ruby的“foo”.respond_to? :方法
(has-method-p *myobj* 'foo-method) ;; -> T
对于插槽有slot-exists-p,方法是什么?
谢谢 .
2 回答
Common Lisp对象模型基于generic function的概念,因此方法附加到GF,而不是普通对象,请参阅generic-function-methods(它在MOP中,而不是ANSI CL,因此您需要使用apropos找到它所包含的包或find-all-symbols) .
The Common Lisp Object System有一个非常强大的MetaObject Protocol . 您可以使用它来查看(并经常修改!)有关对象和函数的大量内部信息 .
您可以使用MOP函数SPECIALIZER-DIRECT-GENERIC-FUNCTIONS来查找包含专门针对某个类的方法的所有泛型函数,这与您在Ruby中所要求的一致 . 您实际上可以找到专门针对类或其任何超类的所有泛型函数(对于SBCL;对于其他实现,请查看close-mop或实现的mop包):
这个函数的问题在于许多内置的泛型函数专注于泛型超类型T,所以在SBCL中你会得到一个605泛型函数的列表,这些函数可能并不那么有趣 . 但是,您可以使用这种通用方法构建一些有趣的工具,例如,通过基于包过滤超类列表或通用函数 .