문제

Java의 java.lang.class 클래스에는 GetDeclaredFields가 주어진 클래스의 모든 필드를 반환 할 수 있습니다. Common LISP와 비슷한 것이 있습니까? 나는 성공적인 LISP에서 지침을 시험해 보면서 설명, 검사 및 Symbol-Plist와 같은 유용한 기능을 발견했습니다.http://www.psg.com/~dlamkins/sl/chapter10.html). 그러나 그들 중 누구도 GetDeclaredfields가하는 일을하지 않습니다.

도움이 되었습니까?

해결책

클래스 슬롯 및/또는 클래스 다이렉트 슬롯을 사용해야합니다 (둘 다 Clos MetaObject Protocol, MOP). 클래스 슬롯은 주어진 클래스에 존재하는 모든 슬롯을 반환하고 클래스 다이렉트 슬롯을 반환합니다. 모든 슬롯은 클래스 정의에서 선언됩니다.

다른 LISP 구현은 MOP를 약간 다르게 구현합니다. 사용 더 가까이 MOP에 대한 균일 한 인터페이스가있는 패키지.

예시:

(defclass foo ()
  (foo-x))

(finalize-inheritance (find-class 'foo)) ;this is needed to be able to query class slots and other properties. Or, class is automatically finalized when its first instance is created

(class-slots (find-class 'foo))
=> (#<STANDARD-EFFECTIVE-SLOT-DEFINITION FOO-X>)

(slot-definition-name (first (class-slots (find-class 'foo))))
=> FOO-X

예시 :

(defun inspect (( object standard-object))
  (inspect-rec (class-slots (class-of object)) object) )


(defun inspect-rec (slots o)
  ( if(atom slots) ()
   (let ((sn (slot-definition-name (car slots)))) (cons (list sn '=> ( slot-value o sn) )  ( inspect-rec (cdr slots) o)))))

다른 팁

나는 당신이 찾고 있다고 생각합니다 CL에 대한 메타 브리저 프로토콜.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top