【问题标题】:List object methods in Common Lisp (CLOS)在 Common Lisp (CLOS) 中列出对象方法
【发布时间】:2014-07-24 02:31:50
【问题描述】:

有什么方法可以获取为对象定义的所有方法并检查对象是否响应指定的方法?

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

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

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

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

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

谢谢。

【问题讨论】:

标签: oop lisp common-lisp clos


【解决方案1】:

您可以使用 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 个泛型函数的列表,这些函数可能并不那么有趣。但是,您可以使用这种通用方法构建一些有趣的工具,例如,通过基于包过滤超类或通用函数列表。

【讨论】:

    【解决方案2】:

    Common Lisp 对象模型基于 generic function 的概念,因此方法附加到 GF,而不是普通对象,参见 generic-function-methods(它在 MOP 中,而不是 ANSI CL,所以你需要找到使用 aproposfind-all-symbols 打包它。

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

    【讨论】:

    • 看起来像是特定的实现,在 SBCL 中没有像 generic-function-methods 这样的功能。
    • 谢谢,它在 sbcl 的 sb-mop 包中。
    • 我推荐使用 closeer-mop 库,它为一些(大多数?)常见的 lisp 实现提供了对 MOP 的统一访问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    相关资源
    最近更新 更多