有没有办法找到所有专门针对给定类型的函数?
我设想你可以从 repl 中执行一些东西(find-all-specializing-methods 'my-class)
,它会返回一个方法列表,比如(mypackage1:my-method-1 my-package2:my-method-2 etc.)
我认为必须有一种简单的方法来做到这一点,因为 MOP 本身可能需要存储这样一个列表来决定调用哪些方法。
有没有办法找到所有专门针对给定类型的函数?
我设想你可以从 repl 中执行一些东西(find-all-specializing-methods 'my-class)
,它会返回一个方法列表,比如(mypackage1:my-method-1 my-package2:my-method-2 etc.)
我认为必须有一种简单的方法来做到这一点,因为 MOP 本身可能需要存储这样一个列表来决定调用哪些方法。
为了发现您可以查看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
通用函数的实现。