2016-12-06 57 views
0

我可以從LISP中獲取類中的所有方法名稱嗎?LISP - 獲取類中的所有方法名稱

其實我需要的方法,這在他們的名字

SET-

+0

你要找的是所謂MOP - [元對象協議(http://mop.lisp.se/)。 – sds

+1

方法沒有在類上定義。它們根據一個或多個參數專門化泛型函數。您可能希望找到名爲「set-」的所有方法,這些方法專門針對該類作爲第一個參數。但也許更重要的是,爲什麼? – coredump

+1

@coredump使用SET我正在設置一些屬性,我需要打印這些屬性名稱。它們中的一些被保存在插槽中,但是有些屬性沒有保存在插槽中,所以獲得所有插槽是不夠的。 –

回答

2

對於LispWorks:

(defun find-all-methods (class prefix) 
    (loop for method in (clos:specializer-direct-methods class) 
     for gf   = (method-generic-function method) 
     for fname  = (generic-function-name gf) 
     for fname-string = (when (symbolp fname) (symbol-name fname)) 
     when (and (stringp fname-string) 
        (>= (length fname-string) 
         (length prefix)) 
        (string= fname-string prefix 
          :end1 (length prefix) 
          :end2 (length prefix))) 
     collect method)) 

例子:

CL-USER 20 > (pprint (find-all-methods (find-class 'capi:button) "PRINT-")) 

(#<STANDARD-METHOD CAPI:PRINT-COLLECTION-ITEM NIL (CAPI:BUTTON T) 40E06173D3> 
#<STANDARD-METHOD CAPI:PRINT-CAPI-BUTTON NIL (CAPI:BUTTON) 40E05F9DDB>)