2009-11-05 2 views
7

나는 다음과 같이 분자 역학에 대한 몇 가지 일을하는 클래스를 형성하고 있습니다 :initform은 언제 사용됩니까?

(defclass %atom (particle) 
    ((name :initarg :name :initform (error "Every atom in the system must have a name!")) 
    (mass :accessor mass :initarg :mass :initform (getmass name)) 
    (charge :accessor charge :initarg :charge :initform (getcharge name)))) 

가 처음에 내가 어떻게 든 initform 즉 (getmass 명)으로 클래스 정의 내에서 다른 슬롯을 참조 수 있다고 생각 -하지만 사실이 아님이 밝혀졌습니다 (또는 그렇지 않습니까?!). 대신, initialize-instance는 모든 초기화 작업을 처리 할 수있는 공간이라고 할 수 있습니다.

내가 가진 질문은 다음과 같습니다. initform 사용? 관용적 환경 설정이란 무엇입니까? 나는 init()가 제공되지 않을 때, ("...") 코드를 생성하고, 디폴트 인자를 초기화하기 위해 위와 같이 사용하는 것을 보았다. 하지만 둘 모두 초기화 인스턴스에 쉽게 들어갈 수 있으며 거기에서 더 이해할 수 있습니다. 특별한 방법이 있습니까? initform이 일반적으로 사용됩니까?

답변

4

일반적으로 슬롯을 기본 값으로 지정하기 위해 initform을 사용합니다. defclass를 사용하면 단순히 다른 슬롯을 기반으로 initform을 계산할 수 없습니다. 다른 합병증이 있으므로 initform을 간단한 형식으로 사용해야합니다.

  • 는 '키 기능 설정 NIL

  • 하는 화면 객체 윈도우의리스트를 설정 0.0

  • 로 3 차원 벡터 객체의 Z 슬롯 세트 '개체 ID #'ID 슬롯

  • 오류의 '보고서 문자열'슬롯을 "오류가 발생했습니다"로 설정

다른 복잡한 방법으로 슬롯 값을 설정해야합니다. MAKE-INSTANCE 뒤에 객체를 자동으로 설정해야하는 경우 : AFTER 메소드를 사용하여 INITIALIZE-INSTANCE.

2

조금 더 복잡하게하기 위해 클래스 옵션 :default-initargs도 있습니다. 슬롯이 :initarg이없는 경우

는 개인적으로 나는 initialize-instance에 대한 사후 방법의 모든 기능이 필요하지 않을 때 바로 가기로 :default-initargs:initform를 사용하고 :initform.