找到专门用于给定类型的所有方法

时间:2013-01-11 10:10:10

标签: common-lisp

有没有办法找到专门针对给定类型的所有函数?

我想象你可以从(find-all-specializing-methods 'my-class)这样的repl执行一些事情,它会返回一个方法列表,如(mypackage1:my-method-1 my-package2:my-method-2 etc.)

我认为必须有一种简单的方法可以做到这一点,因为MOP本身可能需要存储这样的列表来决定调用哪些方法。

1 个答案:

答案 0 :(得分:5)

为了找到您可以查看slime-who-specializes并了解如何进行设置。

按照定义,我到目前为止(对于SBCL):

#+#.(swank-backend::sbcl-with-xref-p)
(progn
  (defmacro defxref (name &optional fn-name)
    `(defimplementation ,name (what)
       (sanitize-xrefs   
        (mapcar #'source-location-for-xref-data
                (,(find-symbol (symbol-name (if fn-name
                                                fn-name
                                                name))
                               "SB-INTROSPECT")
                  what)))))
  (defxref who-calls)
  (defxref who-binds)
  (defxref who-sets)
  (defxref who-references)
  (defxref who-macroexpands)
  #+#.(swank-backend:with-symbol 'who-specializes-directly 'sb-introspect)
  (defxref who-specializes who-specializes-directly))

此功能是针对不同的Lisp单独实现的,因此如果您需要特定的详细信息,则需要查看:swank-<your lisp>.lisp文件并搜索who-specializes泛型函数的实现。