4

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

寻找像 Ruby 的 "foo".methods 之类的东西

(list-methods *myobj*) ;; -> (method0 method1 methodN)

还有像 ruby​​ 的“foo”.respond_to 之类的东西?:方法

(has-method-p *myobj* 'foo-method) ;; -> T

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

谢谢。

4

2 回答 2

8

您可以使用 MOP 函数 SPECIALIZER-DIRECT-GENERIC-FUNCTIONS 来查找包含专门针对某个类的方法的所有泛型函数,这与您在 Ruby 中的要求接近。实际上,您可以找到所有专门用于类或其任何超类的通用函数(对于 SBCL;对于其他实现,请查看更紧密的拖把或实现的 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)))))

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

于 2014-07-25T08:00:56.500 回答
6

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

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

于 2014-07-24T02:53:50.617 回答