2016-12-06 10 views
0

클래스의 모든 메소드 이름을 LISP로 가져올 수 있습니까?LISP - 클래스의 모든 메소드 이름을 얻는다

는 사실은 내가 이름에 세트 -

이 메소드가 필요합니다. LispWorks를 들어

+0

당신이 MOP라고 찾고 있습니다 - [metaobject를 프로토콜 (http://mop.lisp.se/). – sds

+1

메소드가 클래스에 정의되어 있지 않습니다. 하나 이상의 인수에 따라 일반 함수를 특수화합니다. 첫 번째 인수로 클래스를 전문으로하는 "set-"이라는 메서드를 모두 찾고자 할 수 있습니다. 그러나 아마도 더 중요한 것은, 왜? – coredump

+1

@coredump SET를 사용하여 일부 속성을 설정 중이므로 해당 속성 이름을 인쇄해야합니다. 그 중 일부는 슬롯에 저장되지만 슬롯에 저장되지 않는 속성이 있으므로 모든 슬롯을 확보하는 것만으로는 충분하지 않습니다. –

답변

2

:

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