수색…


클래스의 슬롯 이름을 얻습니다.

우리는 수업을 다음과 같이 말합니다.

(defclass person ()
  (name email age))

클래스의 슬롯 이름을 얻으려면 class-slots 함수를 사용합니다. 이것은 클로이 샵 시스템 (close-mop system)에 의해 제공되는 클로이 모프 (close-mop) 패키지에서 찾을 수 있습니다. 우리가 사용하는 실행중인 lisp 이미지를로드하려면 (ql:quickload :closer-mop) . 클래스 슬롯을 호출하기 전에 클래스가 마무리되었는지도 확인해야합니다.

(let ((class (find-class 'person)))
  (c2mop:ensure-finalized class)
  (c2mop:class-slots class))

유효 슬롯 정의 객체 목록을 반환합니다.

(#<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION S/TRANSFORMATIONS::NAME>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION S/TRANSFORMATIONS::EMAIL>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION S/TRANSFORMATIONS::AGE>)

다른 슬롯이 수정되면 슬롯 업데이트

CLOS MOP는 슬롯에 값이 액세스, 읽기 또는 수정 될 때 호출되는 후크 슬롯 - 값 - 사용 - 클래스를 제공합니다. 이 경우에는 수정 (setf slot-value-using-class) 때문에 (setf slot-value-using-class) 대한 메소드를 정의합니다.

(defclass document ()
  ((id :reader id :documentation "A hash computed with the contents of every other slot")
   (title :initarg :title :accessor title)
   (body :initarg :body :accessor body)))

(defmethod (setf c2mop:slot-value-using-class) :after
    (new class (object document) (slot c2mop:standard-effective-slot-definition))
  ;; To avoid this method triggering a call to itself, we check that the slot
  ;; the modification occurred in is not the slot we are updating.
  (unless (eq (slot-definition-name slot) 'id)
    (setf (slot-value object 'id) (hash-slots object))))

인스턴스 생성 slot-value 가 호출되지 않기 때문에 initialize-instance :after 메소드에서 코드를 복제해야 할 수도 있습니다

(defmethod initialize-instance :after ((obj document) &key)
  (setf (slot-value obj 'id)
        (hash-slots obj)))


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow