2016-12-06 16 views
0

Могу ли я получить в LISP все имена методов из класса?LISP - получить все имена методов из класса

На самом деле мне нужны методы, которые имеют

комплект-

в их именах.

+0

Что вы ищете называется MOP - [метаобъект протокол] (http://mop.lisp.se/). – sds

+1

Методы не определены для классов. Они специализируют общую функцию в соответствии с одним или несколькими аргументами. Вы можете найти все методы с именем «set-», которые специализируются на классе в качестве первого аргумента. Но, что еще важнее, почему? – coredump

+1

@coredump using 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>)