Methods CommonLisp:从泛型函数中提取方法

Methods CommonLisp:从泛型函数中提取方法,methods,common-lisp,clos,generic-function,mop,Methods,Common Lisp,Clos,Generic Function,Mop,有没有办法从Common Lisp中的泛型函数中提取方法列表? 例如: (defmethod say ((self string)) ; method-0 (format t "Got string: ~a~%" self)) (defmethod say ((self integer)) ; method-1 (format t "Got integer: ~a~%" self)) (defmethod say ((self symbol)) ; method-2 (forma

有没有办法从Common Lisp中的泛型函数中提取方法列表?
例如:

(defmethod say ((self string)) ; method-0
  (format t "Got string: ~a~%" self))

(defmethod say ((self integer)) ; method-1
  (format t "Got integer: ~a~%" self))

(defmethod say ((self symbol)) ; method-2
  (format t "Got symbol: ~a~%" self))

(extract-methods-from-generic 'say) ; -> (method-0-obj method-1-obj method-2-obj)
更具体地说,我的目标是ECL,所以如果这可以通过C API实现,那没关系。
我需要这个来做下一个技巧:

(defgeneric merged-generic ())

(loop for method
      in (extract-methods-from-generic 'some-generic-0)
      do (add-method merged-generic method))
(loop for method
      in (extract-methods-from-generic 'some-generic-1)
      do (add-method merged-generic method))

通用函数
generic function methods
可在CLO中获取通用函数的所有方法(请参见),但请注意,对于问题的第二部分,仅当方法与任何其他通用函数分离时,才可以将方法附加到通用函数(使用
add method
):

如果该方法已与某些其他泛型函数关联,则还会发出错误信号

您可以通过软件包独立于任何实现使用这两种功能:

CL-USER> (ql:quickload "closer-mop") 
("closer-mop")
CL-USER> (in-package :closer-mop)
#<Package "CLOSER-MOP">
C2MOP> (defgeneric say (x))
#<COMMON-LISP:STANDARD-GENERIC-FUNCTION SAY #x30200176712F>
C2MOP> (defmethod say ((self string)) ; method-0
  (format t "Got string: ~a~%" self))

(defmethod say ((self integer)) ; method-1
  (format t "Got integer: ~a~%" self))

(defmethod say ((self symbol)) ; method-2
  (format t "Got symbol: ~a~%" self))
#<COMMON-LISP:STANDARD-METHOD SAY (SYMBOL)>
C2MOP> (generic-function-methods #'say)
(#<COMMON-LISP:STANDARD-METHOD SAY (SYMBOL)> #<COMMON-LISP:STANDARD-METHOD SAY (INTEGER)> #<COMMON-LISP:STANDARD-METHOD SAY (STRING)>)
C2MOP> (defgeneric merged-generic (x))
#<COMMON-LISP:STANDARD-GENERIC-FUNCTION MERGED-GENERIC #x30200181B74F>
C2MOP> (add-method #'merged-generic (first **))

#<COMMON-LISP:STANDARD-METHOD SAY (SYMBOL)> is already a method of #<COMMON-LISP:STANDARD-GENERIC-FUNCTION SAY #x30200165863F>.
   [Condition of type SIMPLE-ERROR]
; Evaluation aborted on #<SIMPLE-ERROR #x3020016719FD>.
CL-USER> (let ((first-method (first (generic-function-methods #'say))))
           (remove-method #'say first-method)
           (add-method #'merged-generic first-method))
#<COMMON-LISP:STANDARD-GENERIC-FUNCTION MERGED-GENERIC #x302000DC54DF>
CL-USER> (merged-generic "a string")
Got string: a string
NIL
CL-USER>(ql:quickload“closer-mop”)
(“更近的拖把”)
CL-USER>(包装内:closer mop)
#
C2MOP>(如(x))
#
C2MOP>(defmethod say((自字符串));方法-0
(格式t“Got string:~a~%”self)
(defmethod say((自整数));方法1
(格式t“Got integer:~a~%”self)
方法2
(格式t“Got符号:~a~%”self)
#
C2MOP>(通用函数方法)
(# # #)
C2MOP>(非通用合并通用(x))
#
C2MOP>(添加方法#'合并-通用(第一个**))
#已经是#的一种方法。
[简单错误类型的条件]
; 对#的评估已中止。
CL-USER>(let((第一种方法(第一种(泛型函数方法)假设)))
(删除方法#说第一种方法)
(添加方法#'合并-通用第一种方法))
#
CL-USER>(合并的通用“字符串”)
有绳子:一根绳子
无

好的,但是否可以“克隆”一个方法并将其副本附加到另一个通用函数?您可以查看此问题的答案:@Renzo thas clonig a object。他希望在不破坏原始方法的情况下,在两个通用方法之间进行合并,这在本答案中完成。也许有人能以某种方式代理它?