Java의 java.lang.Class 클래스에는 주어진 클래스의 모든 필드를 반환하는 getDeclaredFields 메소드가 있습니다. Common Lisp과 비슷한 것이 있습니까? 필자는 Successful Lisp, Chapter 10 (http://www.psg.com/~dlamkins/sl/chapter10.html)에있는 지침을 읽은 후 설명, 검사 및 기호 plist와 같은 유용한 기능을 발견했습니다. 그러나 getDeclaredFields가하는 일은 그들 중 누구도하지 않습니다.Common Lisp의 클래스 내성 검사
11
A
답변
11
클래스 슬롯 및/또는 클래스 다이렉트 슬롯 (둘 다 CLOP Metaobject Protocol, MOP에서 제공)을 사용해야합니다. class-slots은 주어진 클래스에 존재하는 모든 슬롯을 반환하고, class-direct-slots은 클래스 정의에서 모든 슬롯을 반환합니다.
다른 lisp 구현은 MOP를 약간 다르게 구현합니다. closer-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)))))
6
나는 MetaObject Protocol for CL을 찾고 있다고 생각합니다.