6

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

我设想你可以从 repl 中执行一些东西(find-all-specializing-methods 'my-class),它会返回一个方法列表,比如(mypackage1:my-method-1 my-package2:my-method-2 etc.)

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

4

1 回答 1

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))

这个功能是针对不同的 Lisps 单独实现的,所以如果你需要特定的细节,你需要查看:swank-<your lisp>.lisp文件并搜索who-specializes通用函数的实现。

于 2013-01-11T14:27:34.673 回答